Mongo聚合框架对大数据的影响

时间:2016-09-23 07:18:22

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation

你能帮我搞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聚合实现所需的结果?

1 个答案:

答案 0 :(得分: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阶段,您将items数组规范化 collection A以便能够将其输出传递给下一个 阶段

  2. $lookup阶段,您在两个集合之间进行左连接     这是同一个数据库的一部分,在这种情况下用于获取     来自collection B

  3. 的商品信息
  4. 在第二个$unwind阶段,您可以规范化您提取的数据     来自collection B以展平包含该数组的数组     collection B中映射到相应对象的对象     collection A

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

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

    { "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] }
    { "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] }