Skip to content

fallanic/merge-mongoid

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

merge-mongoid

Easily merge two Mongoid documents.

What it does

Let's say we have two Mongo Documents : document A and document B (same class).

When merging document B into document A, arrays and nested objects will be merged, but duplicate values are not kept.

For the other data types we always keep Document A values, unless the A value is nil and the B is not.

Example of data merge

Object A :

{
	_id : "507f1f77bcf86cd799439011",
	a_string : "This is the A object"
    a_number : 100,
    a_boolean : true,
    array_simple_types : ["an","array","with","elements"],
    array_hashes : [{
      "id" : "507f191e810c19729de860ea",
      "attribute" : "yes there is one"
    },{
      "id" : "4f202e64e6fb1b56ff000000",
      "attribute" : "a value here too"
    }],
    a_hash : {
        "_id" : "5bf9f23d8ead0e1d32756346",
        "a string" : "hello",
        "a number" : 12
    }
}

Object B :

{
    _id : "4f2030d9e6fb1b56ff000001",
	a_string : "This is the B object"
    a_number : 8888,
    a_boolean : false,
    array_simple_types : ["an","array","with","cool","things"],
    array_hashes : [{
      "id" : "4af9f23d8ead0e1d32000000",
      "attribute" : "this is a different object"
    },{
      "id" : "4f202e64e6fb1b56ff000000",
      "attribute" : "this one was already there, but for some reason the attribute is different (which is weird BTW)"
    }],
    a_hash : {
        "_id" : "4af9f23d8ead0e1d32111111",
        "a string" : "another string value",
        "a number" : 40,
        "a third attribute" : true
    }
}

Ruby method call

A.merge! B

Now A contains these values :

{
	_id : "507f1f77bcf86cd799439011",
	a_string : "This is the A object"
    a_number : 100,
    a_boolean : true,
    array_simple_types : ["an","array","with","elements","cool","things"],
    array_hashes : [{
      "id" : "507f191e810c19729de860ea",
      "attribute" : "yes there is one"
    },{
      "id" : "4f202e64e6fb1b56ff000000",
      "attribute" : "a value here too"
    },{
      "id" : "4af9f23d8ead0e1d32000000",
      "attribute" : "this is a different object"
    }],
    a_hash : {
        "_id" : "5bf9f23d8ead0e1d32756346",
        "a string" : "hello",
        "a number" : 12,
        "a third attribute" : true
    }
}

Disclaimer

I am not a Ruby expert! I just happened to need this feature for a Rails app, so I developed a gem.

Probably a few things are not perfect or simply ARE NOT WHAT YOU WOULD EXPECT (ex : I don't keep duplicate values in arrays, but maybe you want to).

I highly recommend to test if the gem behaves correctly with your data before using it in production!

If you notice anything wrong, please feel free to send a Pull Request (including a fix + some tests). Same thing if you enhance the gem with some cool features, I would be happy to merge.

Getting Started

Install the gem with: gem install merge-mongoid or add gem 'merge-mongoid', :git => 'https://github.com/fallanic/merge-mongoid' to your Gemfile.

Usage

You need to add one line in your Model :

class Myclass
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Document::Mergeable
  
  ...
end

And then call :

A.merge! B

B attributes will be merged into A.

B is also destroyed after the merge has been successful.

Testing

In the terminal, you'll need to start a mongoDB connection

To do this, you'll need to run mongod while specifying a local folder

EX:

$ mkdir tmpdb
$ mongod --dbpath ./tmpdb

Open another tab and run rspec

That's all folks!

License

Copyright (c) 2013 Fabien Allanic
Licensed under the MIT license.

About

Easily merge two Mongoid documents.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages