mongodb - 如何聚合 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
我无法构建这个“嵌套”级别的动物/所有者/文档
解决方案
您可以在 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
with$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"}}
])
推荐阅读
- sql - 消除 PL/SQL 函数中的重复代码片段
- filesystems - UEFI 的读写 ext4 文件系统驱动程序
- ios - 无法将用于应用审核的模拟器构建上传到 Instagram
- python - Python更改列值 - 一次每一行
- javascript - 是什么导致了这里的无限循环?
- c# - 保存我正在阅读的 XML 文件
- flutter - 我无法使用我的第二个帐户登录 Google
- c++ - 为什么 clang++ 和 clang-check 会产生不同的 AST?
- c# - C#asp.net中如何调用网页上所有选择的值
- javascript - fetch .then 回调函数中的隐式响应