Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在两个级别上进行聚合并保留文档?_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Mongodb 如何在两个级别上进行聚合并保留文档?

Mongodb 如何在两个级别上进行聚合并保留文档?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,这是我用来处理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" }, {

这是我用来处理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
尝试了一些聚合,但我无法构建这个“嵌套”级别的动物/所有者/文档,您可以在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"}}}}
])

使用
$mergeObjects
$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"}}
])

谢谢你救了我一天!第二个查询不适用于我的真实案例,因为
owner
et
kind
objectid
而不是string(
$arrayToObject
抛出一个错误),但是第一个查询成功了!