0

你能帮我做 mongoDB 聚合吗?这是我接下来想做的事情:

我有收藏A。来自的文档A代表一个对象,例如:

{
  nameA: 'first',
  items: [
    'item1',
    'item2',
    'item3',
    'item4'
  ]
}

我有一个包含以下B文件的集合:

[
    {
      item: 'item3',
      info: 'info1'
    },
    {
      item: 'item3',
      info: 'info2'
    },
    {
      item: 'item3',
      info: 'info3'
    }
]

我使用大数据,所以最好在一个查询中完成。假设我们已经拥有集合 A 的所有数据。我想在集合 B 上构建一个查询以获得下一个结构结果:

{
    'first'/*nameA*/: ['info1', 'info2', 'info3'],
    ....
}

如何使用 MongoDB 聚合实现预期结果?

4

1 回答 1

1

正如 Rahul Kumar 在他的评论中提到的,您的设计更倾向于关系数据库模式设计,这使得设计高效的 MongoDB 变得相当困难。

但是,仍然可以通过利用$lookup聚合框架的阶段来实现您正在寻找的功能,如下所示:

db.A.aggregate([
    {
        $unwind: {
            path: "$items"
        }
    },
    { 
        $lookup: {
            from: "B",
            localField: "items",
            foreignField: "item",
            as: "item_info"
        }
    },

    {
        $unwind: {
            path: "$item_info"
        }
    },

    {
        $group: {
            _id: "$nameA",
            item_info: { $addToSet: "$item_info.info" }
        }
    }
]);
  1. 在第一阶段,您对数组进行 $unwind规范化,以便能够将其输出传递到下一阶段itemscollection A

  2. 在该$lookup阶段,您在属于同一数据库的两个集合之间进行左连接,在这种情况下,用于从中获取项目信息collection B

  3. 在第二$unwind阶段,您对从中提取的数据进行规范化collection B,以便展平包含collection B映射到相应项目的对象的数组collection A

  4. 最后,在$group阶段中,您将结果集的所有条目分组nameA并创建一个唯一项目信息值的数组。如果您想要所有重复出现的项目信息值,您可以将$addToSet 累加器替换为$push.

以下是在您提供的集合上运行上述聚合管道的结果:

{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] }
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] }
于 2016-09-23T08:36:49.007 回答