【问题标题】:Mongo aggregation framework on big dataMongo 大数据聚合框架
【发布时间】:2016-09-23 16:36:49
【问题描述】:

能否请您帮我处理 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 聚合实现预期结果?

【问题讨论】:

  • 这不是很有帮助的设计,注意 Mongo 不允许连接,有 $lookup 可以像左连接一样操作,你可以查看聚合管道中 $lookup 的文档。

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


【解决方案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. 在第二个$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" ] }

【讨论】:

  • 是的 :) 我知道使用关系数据库模式设计会更好,但它已经写好了。非常感谢您的帮助!非常感谢!
猜你喜欢
  • 2015-12-21
  • 2015-10-31
  • 1970-01-01
  • 2021-01-20
  • 2013-07-20
  • 2018-09-23
  • 1970-01-01
  • 2014-12-14
  • 2013-03-09
相关资源
最近更新 更多