按字段比较2个mongoDb集合的最佳方法
我试图找出匹配MongoDb集合的最佳方法,以查找两者中不存在的文档 想象一下,我们有原始的MongoDb集合和应用程序数据 db.Coll1按字段比较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
{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'}
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