0

请帮我解决一下mongoDB汇总问题。以下是我想要做的下一步:关于大数据的Mongo汇总框架

我有收藏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的聚集所期望的结果?

+0

这是不是非常有帮助的设计,注意蒙戈不允许加入,有$查询像左连接一样操作,您可以在汇总管道中查看$ lookup的文档。 –

回答

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. 在th然后左转ê$lookup阶段两个集合 属于同一数据库的一部分之间的连接,在这种情况下,用来从collection B

  3. 的 项目信息在您标准化您从中提取 数据中的第二$unwind阶段collection B以便弄平含有从collection B的 对象被映射到相应的 项阵列中collection A

  4. 最后,在阶段$group你组中的所有通过nameA设置 结果集的条目,并创建一组唯一的项目信息 值。如果您希望所有重复出现的商品信息值为 ,则可以用$push代替累加器中的$addToSet

下面是运行,您所提供的藏品上述聚合管道的结果:

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

是的:)我知道使用关系数据库模式设计会更好,但它已经写好了。非常感谢您的帮助!非常感谢你! –