【问题标题】:Nested group in mongodb aggregation pipelineMongoDB聚合管道中的嵌套组
【发布时间】:2022-02-14 20:16:44
【问题描述】:

我正在使用 Mongo DB,并且我有一个对象列表,我需要将这些对象分组到类别 -> 子类别 -> 不同类型的子类别中。 你可以在这个 mongodb 游乐场找到代码>https://mongoplayground.net/p/BfR7FT28XKN

我创建组类别 -> 所有子类别。 但是如何才能对同名的子类别进行分组呢?

我的目标是实现这样的目标:

{
    "_id": "Food and Drink",
    "subCategories": [
      {
        "details": "Wine Bar",
        "subCategory": "Bar",
      },
      {
        "details": "Jazz and Blues Cafe",
        "subCategory": "Nightlife",
      },
      {
        "subCategory": "Restaurants",
        "types": [
              {
                "details": "Mediterranean",
                "subCategory": "Restaurants",
              },
              {
                "details": "Mexican",
                "subCategory": "Restaurants",
              }
           ]
       },
      
    ]
  }

谢谢

【问题讨论】:

  • 你的结果我还不清楚。为什么其他文档没有类型数组。以及为什么带有类型数组的那个没有详细信息,而是嵌套在数组内的文档中。
  • 上面的例子是一个简化来解释我想要的东西:如果你在 mongodb 操场上运行查询,你会看到所有的类别都与里面的所有子类别分组......但是你会发现 subcategory与“Restaurants”同名..我还希望将它们分组在一个我称之为“类型”的数组中。只有当有多个具有相同名称的子类别时,才必须创建数组“类型”..希望我自己解释一下
  • 我建议您保持界面一致,如果没有文档,请保持类型数组保持为空。

标签: javascript mongodb aggregation


【解决方案1】:

这就是您需要的。您需要先按类别和子类别进行分组。我已经按类型推送了完整的文档。您可以根据需要过滤字段或进行更改。

[{
"$match": {
  "category": {
    "$ne": null
  },
  "subCategory": {
    "$ne": null
  }
 }
},
{
 $group: {
  _id: {
    cat: "$category",
    sub: "$subCategory",
    
   },
   docs: {
    $push: "$$ROOT"
   }
 }
},
{
$group: {
  _id: "$_id.cat",
  subCategories: {
    $push: {
      subCategory: "$_id.sub",
      types: "$docs"
    }
  }
 }
}]

从最后阶段删除types: "$docs",这就是你会得到的

[{
"_id": "Community",
"subCategories": [
  {
    "subCategory": "Education"
  },
  {
    "subCategory": "Disabled Persons Services"
  }
 ]
},
{
 "_id": "Food and Drink",
 "subCategories": [
  {
    "subCategory": "Bar"
  },
  {
    "subCategory": "Nightlife"
  },
  {
    "subCategory": "Restaurants"
  }
 ]
}]

游乐场 https://mongoplayground.net/p/nwyAivJOZj5

【讨论】:

  • 谢谢,正是我需要的
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2020-11-04
  • 2017-07-26
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多