Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按字段比较2个mongoDb集合的最佳方法_Mongodb_Aggregation Framework - Fatal编程技术网

按字段比较2个mongoDb集合的最佳方法

按字段比较2个mongoDb集合的最佳方法,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图找出匹配MongoDb集合的最佳方法,以查找两者中不存在的文档 想象一下,我们有原始的MongoDb集合和应用程序数据 db.Coll1 {u id':'someValue',…'externalKey':'1'} {u id':'someValue',…'externalKey':'2'} {u id':'someValue',…'externalKey':'3'} 其中“externalKey”始终包含值并且是唯一的 现在,它被另一个具有相同格式文档但数据更新的集合所取代 Coll2

我试图找出匹配MongoDb集合的最佳方法,以查找两者中不存在的文档

想象一下,我们有原始的MongoDb集合和应用程序数据

db.Coll1

{u id':'someValue',…'externalKey':'1'}
{u id':'someValue',…'externalKey':'2'}
{u id':'someValue',…'externalKey':'3'}
其中“externalKey”始终包含值并且是唯一的

现在,它被另一个具有相同格式文档但数据更新的集合所取代

Coll2

{u id':'someValue',…'externalKey':'1'}
{u id':'someValue',…'externalKey':'2'}
{u id':'someValue',…'externalKey':'4'}
假设在为我们要查找的业务流程(和流程)覆盖Coll2=>Coll1之前:

  • 正在删除的文档(在Coll1中是文档
    {u id':'someValue',…'externalKey':'3'}

  • 将要添加的文档(在Coll2中是
    {u id':'someValue',…'externalKey':'4'}

也就是说,我们正在匹配Col1=>Col2(删除)和Col2=>Col1(添加)

与sql概念相比,它更像是两个键都为null的完全外部联接

SELECT * FROM COLL1 C1

FULL OUTER JOIN COLL2 C2 
WHERE C1.ExternalKey IS NULL 
   AND C2.ExternalKey IS NULL
执行此操作的最快方式是什么? 我的意思是$lookup,自定义代码(比如,通过mongoDb驱动的控制台应用程序)还是MapReduce

假设更新的记录超出范围,不需要重新处理。 MongoDb版本并不重要。 最好是3.6。
可能4.x

最快的方法是按照某些标准(最好是ID)对数据排序,然后比较每个集合中的元素。例如

Collection 1 IDs are:
    1, 2, 3, 5 , 6, 7, 10
Collection 2 IDs are:
    1, 2 3, 4,  5, 6, 8, 9, 10
现在保留两个索引i=0和j=0,每个集合一个索引

If collection1[i] == collection2[j] then i++ and j++
从上面的例子来看,当i=3和j=3时,值不相等

if(collection1[i] > collection2[j]) then add collection2[j] to the adding collection and increase j 
在示例中,4被添加到添加列表中

if(collection1[i] < collection2[j]) then add collection1[i] to the removal list and increase i

如果您拥有TB级的庞大数据库,您需要使用光标读取每个集合中的每个页面,然后进行上面的比较。您可以编写mongoshell脚本来完成这项工作

,谢谢。分页也可以。将尝试和响应分页的问题是,当您拥有数百个这样的庞大数据时数百万GB或TB的数据,skip()操作的性能非常差。有时我们只需花30分钟就可以完成一次skip()
Then repeat the above steps