首页 > 解决方案 > 如何聚合 2 个级别并保留文档?

问题描述

这是我用 Elasticsearch 做的事情,但我找不到如何用 MongoDB 做到这一点。

这是动物系列:

[
  { kind: "Dog", owner: "John", name: "Max" },
  { kind: "Dog", owner: "John", name: "Buddy" },
  { kind: "Dog", owner: "John", name: "Cooper" },
  { kind: "Cat", owner: "John", name: "Charlie" },
  { kind: "Dog", owner: "Peter", name: "Jack" },
]

这是我期待的结果:

{
  Dog: {
    John: [
      { kind: "Dog", owner: "John", name: "Max" },
      { kind: "Dog", owner: "John", name: "Buddy" },
      { kind: "Dog", owner: "John", name: "Cooper" },
    ],
    Peter: [
      { kind: "Dog", owner: "Peter", name: "Jack" },
    ]
  }
  Cat: {
    John: [
      { kind: "Cat", owner: "John", name: "Charlie" }
    ]
  }
}

有什么想法吗?我已经尝试了一些聚合,$group$push我无法构建这个“嵌套”级别的动物/所有者/文档

标签: mongodbmongooseaggregation-framework

解决方案


您可以在 3.6 中使用以下聚合。

嵌套数组结构

db.colname.aggregate([
  {"$group":{"_id":{"kind":"$kind","owner":"$owner"},"docs":{"$push":"$$ROOT"}}},
  {"$group":{"_id":"$_id.kind","ownerbykind":{"$push":{"owner":"$_id.owner","docs":"$docs"}}}}
])

或者

使用$mergeObjectswith$arrayToObject生成所需的结构。

db.colname.aggregate([
  {"$group":{"_id":{"kind":"$kind","owner":"$owner"},"a":{"$push":"$$ROOT"}}},
  {"$group":{"_id":"$_id.kind","b":{"$mergeObjects":{"$arrayToObject":[[["$_id.owner","$a"]]]}}}},
  {"$group":{"_id":null,"c":{"$mergeObjects":{"$arrayToObject":[[["$_id","$b"]]]}}}},
  {"$replaceRoot":{"newRoot":"$c"}}
])

推荐阅读