mongodb - 如何将 mongodb $lookup 与嵌套数组一起使用?
问题描述
我正在尝试执行将结合两个集合的搜索查询。
集合 1 称为库存集合。
{ "fruit_id" : "1", "name" : "apples", "stock": 100 }
{ "fruit_id" : "2", "name" : "oranges", "stock": 50 }
{ "fruit_id" : "3", "name" : "plums", "stock": 60 }
集合 2 称为订单集合
{ "order_id" : "001", "ordered_fruits":
[
{"fruit_id" : "1", "name" : "apples", "ordered" : 5},
{"fruit_id" : "3", "name" : "plums", "ordered" : 20}
]
}
{ "order_id" : "002", "ordered_fruits":
[
{"fruit_id" : "2", "name" : "oranges", "ordered" : 30},
{"fruit_id" : "3", "name" : "plums", "ordered" : 20}
]
}
我正在尝试编写一个查询,该查询返回带有一个附加密钥对的库存集合,该密钥对代表已订购水果的总量。
{ "fruit_id" : "1", "name" : "apples", "stock": 100, "ordered": 5 }
{ "fruit_id" : "2", "name" : "oranges", "stock": 50, "ordered": 30 }
{ "fruit_id" : "3", "name" : "plums", "stock": 60, "ordered": 40 }
我曾尝试使用聚合框架中的$lookup,但嵌套数组变得复杂。我现在很困。
解决方案
您可以使用以下聚合
db.stock.aggregate([
{ "$lookup": {
"from": "orders",
"let": { "fruitId": "$fruit_id" },
"pipeline": [
{ "$match": { "$expr": { "$in": ["$$fruitId", "$ordered_fruits.fruit_id"] }}},
{ "$unwind": "$ordered_fruits" },
{ "$match": { "$expr": { "$eq": ["$ordered_fruits.fruit_id", "$$fruitId"] }}}
],
"as": "orders"
}},
{ "$project": {
"ordered": { "$sum": "$orders.ordered_fruits.ordered" },
"fruit_id" : 1, "name" : 1, "stock": 1
}}
])
推荐阅读
- python - 当我使用基本身份验证在 QGIS 中调用 WMS GetCapabilities 请求时有什么问题吗?
- javascript - 使用javascript“对象代理”时如何获取“this”内容
- outlook - Microsoft Outlook 需要撤销 API
- python - Python字典中的列表
- solr - Solr 查询 ExternalFileField
- intellij-idea - IntelliJ IDEA auto 没有定义数据类型
- mysql - 第 31 行的错误 1118 (42000):行大小太大
- python - 无法弄清楚如何将这两个 for 循环“合并”在一起以最大限度地提高生产力 | Python
- pygsheets - 如何在使用pygsheets获取时将前一行值用于谷歌表格中垂直合并的单元格?
- react-native - 为什么 Swipeable 组件内的根组件默认高度为零