Mongodb 如何在两个级别上进行聚合并保留文档?
这是我用来处理Elasticsearch的,但我找不到如何处理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" }, {
[
{ 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
etkind
是objectid
而不是string($arrayToObject
抛出一个错误),但是第一个查询成功了!