我试图'比较'2个集合之间的所有文档,这将只返回true,并且只有2个集合中的所有文档完全相等。如何比较2个mongodb集合?
我一直在搜索集合上的方法,但没有找到可以做到这一点的方法。
我尝试类似这些在蒙戈外壳,但没有工作,我预计:
db.test1 == db.test2
或
db.test1.to_json() == db.test2.to_json()
反正,即时通讯也采用弹簧数据MongoDB的Java编写的。
请分享您的想法!谢谢。
我试图'比较'2个集合之间的所有文档,这将只返回true,并且只有2个集合中的所有文档完全相等。如何比较2个mongodb集合?
我一直在搜索集合上的方法,但没有找到可以做到这一点的方法。
我尝试类似这些在蒙戈外壳,但没有工作,我预计:
db.test1 == db.test2
或
db.test1.to_json() == db.test2.to_json()
反正,即时通讯也采用弹簧数据MongoDB的Java编写的。
请分享您的想法!谢谢。
您可以尝试使用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代码将在数据库服务器端执行,不能获取集合到客户端。
感谢您的想法。如果我理解正确,这实际上有2个循环,其中test1中的1个文档将与test2中的所有文档一起进行测试..?或者你的意思是说,在test2.find的论点中,我们把obj1的id,因为在我的情况下,test1中的内容必须在test2中具有相同的id。另外,如果test2的文档多于test1,或者test1的文档多于test2(我的情况下,这意味着test1和test2不等于),我会感到非常困惑。任何关于检测这些没有在集合两侧循环的想法?谢谢 ! – bertie 2012-02-11 18:11:04
这段代码经过了两个集合,并在第二个集合中的第一个集合中找到匹配时执行某些操作(或者,如果找不到匹配,可以执行一些操作,只需将if(!equals(...))如果您只是想要比较两个集合是否相等,这可以优化很多......例如,在执行db.test1.find之前,可以比较两个集合的计数,如db.test1.find()。count()== db .test2.find()。count()...如果count不相等,就没有理由继续。另外,正如我在代码中指出的,如果有一些你知道的属性(如_id),你继续...) – 2012-02-11 19:00:19
可以把它放在db.test2.find({... here ...})内,并加速查找第二个对象)。所以,如果你的计数是相等的,你永远不会进入if !equals(...)),那么你的集合是平等的......重要的是,最后,你使用db.eval来确保你的代码直接在服务器上执行,否则,你最终会取这两个集合到客户端可能会减慢很多事情。 – 2012-02-11 19:01:25
使用'db.runCommand('dbHash')'将为你的数据库和集合提供哈希,你可以将集合哈希与另一个集合哈希进行比较。可能会更容易知道这两个集合是否相同。 – Rexford 2016-02-05 12:45:44