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

时间:2018-07-24 00:32:27

标签: mongodb aggregation-framework

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

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

db.Coll1

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

现在,它已被具有相同格式但新数据的文档替换为另一个集合。

Coll2

{'_id': 'someValue', ... 'externalKey':'1'} {'_id': 'someValue', ... 'externalKey':'2'} {'_id': 'someValue', ... 'externalKey':'4'} 假设在为要查找(和处理)的业务目的覆盖Coll2 => Coll1之前:

  • 要删除的文档(在Coll1中为文档{'_id': 'someValue', ... 'externalKey':'3'}

  • 将要添加的文档(在Coll2中为{'_id': 'someValue', ... 'externalKey':'4'}

即我们匹配的是Col1 => Coll2(删除)和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驱动程序的控制台应用程序)或map reduce?

比方说,更新的记录不在范围内,不需要重新处理。 MongoDb的版本无关紧要。 优选3.6。 可能是4.x

1 个答案:

答案 0 :(得分:0)

最快的方法是按照某些条件(最好是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

现在,您保留2个索引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

当i = 5且j = 6时,集合2中缺少7,因此应将其删除

Then repeat the above steps 

如果您有巨大的数据库(如TB),则需要使用游标并从每个集合中读取每个页面,然后进行上面的比较。您可以编写mongoshell脚本