合并Mongodb 3.4.4中的集合

时间:2017-06-16 14:19:30

标签: mongodb aggregation-framework

想象一下,我收集了集合A中的以下文档:

{
  "_id" : 1,
  "ratio" : 6.0
}

我还收集了B集合中的以下文件:

[
  {
    "_id" : 1,
    ratio : 3.0
  },
  {
    "_id" : 2,
    ratio : 4.0
  }
]

如何合并它们以产生以下输出:

[
  {
    "_id" : 1,
    ratio : 6.0
  },
  {
    "_id" : 2,
    ratio : 4.0
  }
]

所以,正如你在上面看到的那样:

  • collectionA._idcollectionB._id匹配时,会产生collectionA的比率,

  • 当ids不匹配时,它采用collectionB的比率。

  • collectionA不会包含collectionB中不存在的ID,因为我在先前的聚合中从collectionB派生collectionA

  • 例如,如果collectionB中有更多ID,则它们也会添加到输出中。

因此,基本上,collectionA会覆盖collectionB,然后collectionB中不匹配的文档也会添加到结果中。

这在我的应用程序代码中实现是微不足道的,但是我的数据库中存在数百万条记录,所以我想在MongoDB中执行此操作。我也知道there is no full-outer-join in MongoDB,有没有办法实现这个结果?

1 个答案:

答案 0 :(得分:0)

  

所以,基本上,collectionA会覆盖collectionB,然后是   来自collectionB的不匹配文档也会添加到结果中。

您只能与MongoDB进行左连接,因此在查询collectionA时,无法从collectionB中选择与collectionA中的任何文档都不匹配的文档。因此,您应该在两个查询中执行此操作。第一个只是从collectionA中选择文档(这些文档无论如何都会覆盖collectionB中的文档,所以我们对collectionB中与collectionA中的文档匹配的文档不感兴趣。)

第二个查询 - 从collectionB获取与collectionA中的任何文档不匹配的文档:

db.collectionB.aggregate([
 {
    $lookup: {
       from: "collectionA",
       localField: "_id",
       foreignField: "_id",
       as: "docs"
    }       
 },
 { $match: { docs: {$eq: [] } } },
 { $project: { docs: 0 } }
])