问题 如何比较2个mongodb系列?


我试图“比较”2个集合之间的所有文档,这将仅返回true,如果只有2个集合中的所有文档完全相同。

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

我在mongo shell中尝试了类似这样的东西,但没有像我预期的那样工作:

db.test1 == db.test2

要么

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

无论如何,我还在java中使用spring-data mongodb。

请分享你的想法!谢谢。


12154
2018-02-11 13:37


起源

使用 db.runCommand('dbHash') 将为您的数据库和集合提供哈希值,您可以将其与另一个集合哈希进行比较。知道两个集合是否相同可能更容易。 - Rexford


答案:


您可以尝试使用mongodb EVAL 结合您的自定义等于功能,类似于 这个

您的方法不起作用,因为在第一种情况下,您正在比较不同的对象引用。在第二种情况下,即使对于相同的对象,也无法保证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,您可以确保在数据库服务器端执行代码,而无需将集合提取到客户端。


13
2018-02-11 14:26



谢谢你的想法。如果我理解正确,这实际上有2个循环,其中test1中的1个文档将使用test2中的所有文档进行测试。或许你的意思是在test2.find的论证中,我们把obj1的id,因为在我的情况下,test1中的内容必须在test2中具有相同的id。而且,如果test2有比test1更多的文档,或者如果test1有多于test2的文档,我会很困惑,在我的情况下,这意味着test1和test2不等于。有关检测这些没有在集合的两侧循环的任何想法?谢谢 ! - bertie
这个代码遍历两个集合,当它从第二个集合中的第一个集合中找到匹配时执行某些操作(或者当找不到匹配时可以执行某些操作,只需放入if(!equals(...)如果您只是想要比较两个集合是否相等,这可以进行大量优化...例如,在执行db.test1.find之前,您可以比较两个集合的计数,例如db.test1.find()。count()== db。 test2.find()。count()...如果count不相等,则没有理由继续。另外,正如我在代码中指出的那样,如果你知道一些属性(比如_id)你(续) ...) - Aleksandar Vucetic
可以把它放在db.test2.find({... here ...})里面并加速第二个对象的查找。所以,如果你的计数是相等的,你永远不会进入if(!equals(...))那么你的集合是相等的...重要的是,最后,你使用db.eval来确保您的代码直接在服务器上执行,或者,您最终会将两个集合提取到客户端,这可能会减慢很多事情。 - Aleksandar Vucetic
我想我有了主意!我会先比较长度,就像你说的那样。我仍然可以通过在第二个集合中找到匹配来对象进行对象比较,并使用类似于此处的解决方案进行比较: stackoverflow.com/questions/1068834/... .. 万分感谢 ! - bertie