2012-02-11 66 views
11

我试图'比较'2个集合之间的所有文档,这将只返回true,并且只有2个集合中的所有文档完全相等。如何比较2个mongodb集合?

我一直在搜索集合上的方法,但没有找到可以做到这一点的方法。

我尝试类似这些在蒙戈外壳,但没有工作,我预计:

db.test1 == db.test2 

db.test1.to_json() == db.test2.to_json() 

反正,即时通讯也采用弹簧数据MongoDB的Java编写的。

请分享您的想法!谢谢。

+3

使用'db.runCommand('dbHash')'将为你的数据库和集合提供哈希,你可以将集合哈希与另一个集合哈希进行比较。可能会更容易知道这两个集合是否相同。 – Rexford 2016-02-05 12:45:44

回答

13

您可以尝试使用mongodb eval结合您的自定义等号功能,如this

您的方法不起作用,因为在第一种情况下,您正在比较不同的对象引用。在第二种情况下,即使对于相同的对象,也不能保证to_json会生成相同的字符串。

相反,尝试这样的事:

var compareCollections = function(){ 
    db.test1.find().forEach(function(obj1){ 
     db.test2.find({/*if you know some properties, you can put them here...if don't, leave this empty*/}).forEach(function(obj2){ 
      var equals = function(o1, o2){ 
       // here goes some compare code...modified from the SO link you have in the answer. 
      }; 

      if(equals(ob1, obj2)){ 
       // Do what you want to do 
      } 
     }); 
    }); 
}; 

db.eval(compareCollections); 

跟你保证db.eval代码将在数据库服务器端执行,不能获取集合到客户端。

+0

感谢您的想法。如果我理解正确,这实际上有2个循环,其中test1中的1个文档将与test2中的所有文档一起进行测试..?或者你的意思是说,在test2.find的论点中,我们把obj1的id,因为在我的情况下,test1中的内容必须在test2中具有相同的id。另外,如果test2的文档多于test1,或者test1的文档多于test2(我的情况下,这意味着test1和test2不等于),我会感到非常困惑。任何关于检测这些没有在集合两侧循环的想法?谢谢 ! – bertie 2012-02-11 18:11:04

+0

这段代码经过了两个集合,并在第二个集合中的第一个集合中找到匹配时执行某些操作(或者,如果找不到匹配,可以执行一些操作,只需将if(!equals(...))如果您只是想要比较两个集合是否相等,这可以优化很多......例如,在执行db.test1.find之前,可以比较两个集合的计数,如db.test1.find()。count()== db .test2.find()。count()...如果count不相等,就没有理由继续。另外,正如我在代码中指出的,如果有一些你知道的属性(如_id),你继续...) – 2012-02-11 19:00:19

+0

可以把它放在db.test2.find({... here ...})内,并加速查找第二个对象)。所以,如果你的计数是相等的,你永远不会进入if !equals(...)),那么你的集合是平等的......重要的是,最后,你使用db.eval来确保你的代码直接在服务器上执行,否则,你最终会取这两个集合到客户端可能会减慢很多事情。 – 2012-02-11 19:01:25