【问题标题】:How to group and combine subdoc arrays with mongo aggregation pipeline如何使用 mongo 聚合管道对 subdoc 数组进行分组和组合
【发布时间】:2021-09-17 11:15:12
【问题描述】:

设想一个集合,该集合在聚合的 $match 运算符上返回具有此结构的文档数组

A = {
  slug:'a',
  Rs:[{
    _id:'foo',
    attr2:'bar'
  }]
}

所以基本上每个返回的文档都共享一个 slug(这就是我将它们分组的方式)但每个文档都有一个子文档数组,每个子文档都有不同的 _id。

因此,当我使用 {slug:"a"} 执行 $match 聚合时,它会返回一个 [A0,A1,A2...] 等数组,它们都共享相同的 slug。我正在调用每个文档 A

接下来在管道中,我将它们分组并希望查看它们的 Rs 数组

{
 $group:{
    _id:'$slug',
    arrays:{$push:'$rs'}
  } 
}

这会返回一个看起来像这样的单个文档

{
  _id:"a",
  arrays: [
  [{_id:'foo',attr2:'bar'},{_id:'foo2',attr2:'beer'}], //The arrays of document A0
  [*A1 arrays*], //the arrays of document A1
  [*A2 arrays*]
  ]
}

所以这是将我的所有文档分组为一个,并将它们的子文档数组作为子数组放在我的分组文档中,这是一个数组数组arrays:[[A0Rs0,A0Rs1],[A1Rs0,A1Rs1],[A2Rs0,etc]]

我的总体目标是连接或展平这些数组,因此我有一个包含所有值的数组,而不是数组数组,理想情况下我希望使用聚合运算符来做到这一点。因此,我最终不会像上面那样以数组数组结束,而是以

{
 _id:"a",
 arrays:[
   {},{},{}... //all of the arrays. In fact these dont even have to be objects, I am after just the ID field of each object
 ]
}

我尝试了 $concatArrays 和其他运算符的组合,不确定是否需要在 $group 之前添加其他步骤或聚合器或如何处理。

我希望我的解释不会太混乱,如果有人能想到一种方法,我将非常感谢您的帮助!

【问题讨论】:

    标签: arrays mongodb mongoose aggregation-framework


    【解决方案1】:

    如果有人有兴趣知道一种方法来获得正确的解决方案,因为我确定不止一种,我设法通过使用运算符组合得到我正在寻找的结果,从 $unwind 开始。

    $unwind 基本上将您的父文档(带有数组的那个)分成多个文档,数组中的每个元素一个。 IT 会为您的所有结果执行此操作,因此现在您不再拥有包含多个子文档数组的多个对象,而是拥有一个包含单个子文档的多个文档。然后你可以使用 $match 和 $group 所以最后你会得到一个包含所有你想要的结果的数组。如果您在这种情况下只关注一个数组,您还可以使用 $project 来减少文档中的字段数。

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 2023-01-20
      • 2020-11-16
      • 2012-11-04
      • 2017-02-14
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多