mongodb - 如何在 MongoDB 中聚合列表?
问题描述
我有一组容器,每个容器都有一组物品。容器的 MongoDB 文档如下所示。如何列出所有容器中的所有项目以及每个项目中的容器名称?
{
"Container": 28392
...
"Items": [
{
"ItemName": "Foo",
...
},
{
"ItemName": "Bar",
...
}
]
}
预期输出:
[
{
"ItemName": "Foo",
"Container": 28392
...
},
{
"ItemName": "Bar",
"Container": 28392
...
},
{
"ItemName": "Baz",
"Container": 52892
...
}
]
这可以通过某种放松来实现吗?如果是这样,我将如何汇总?
解决方案
之后unwind
你可以使用project
舞台做你想做的事:
db.collection.aggregate([
{
$unwind: "$Items"
},
{
$project: {
Container: "$Container",
ItemName: "$Items.ItemName"
}
}
])
操场:
https://mongoplayground.net/p/H-aWx07pCDt
或者,如果您的 mongodb 版本等于或大于 4.2,您可以使用replaceWith
with mergeObjects
,获取 items 数组中的所有字段。
db.collection.aggregate([
{
$unwind: "$Items"
},
{
$replaceWith: {
$mergeObjects: [
{
Container: "$Container"
},
"$Items"
]
}
}
])
操场:
https://mongoplayground.net/p/E5KqFlNq1CL
输入:
[
{
"Container": 28392,
"Items": [
{
"ItemName": "Foo",
"ItemDesc": "Foo desc"
},
{
"ItemName": "Bar",
"ItemDesc": "Bar desc"
}
]
}
]
输出:
[
{
"Container": 28392,
"ItemDesc": "Foo desc",
"ItemName": "Foo"
},
{
"Container": 28392,
"ItemDesc": "Bar desc",
"ItemName": "Bar"
}
]
推荐阅读
- swiftui - 选择新标签时如何更新导航标题?
- proxy - 根据请求路径等特定条件更改响应
- visual-studio-code - 如何更改 LF 的可视代码标准 CRLF?
- python - 具有调用和最小化其他函数的函数的 Python 类
- firebase-realtime-database - 在 Next JS / Vercel 中查询 Firebase 实时数据库时出现 504 超时
- php - 使用 php 显示来自 ftp 服务器的图像
- pdf - GhostScript 也保存原始文件
- javascript - Flow - 类型安全的动作
- python - Python3 os.urandom() 用于密码盐
- jupyter - 将 jupyter notebook 用于 pyQGIS 时设置椭圆返回 False