【发布时间】:2021-06-29 14:13:32
【问题描述】:
我在 MongoDB 中有一个“装运”文档,它具有以下基本结构:
shipment {
"id": "asdfasdfasdf",
"shipDate": "2021-04-02",
"packages": [
{
"id": "adfasdfasdfasdf",
"contents": [
{
"product": {
"id": "asdfasdfasdfasd"
},
"quantity": 10
}
]
}
]
}
请注意,“产品”存储为 DBRef。
我想查找自给定日期以来已发货的特定产品的总数量(基于产品 ID)。我认为这是应该遵循的适当逻辑:
- 匹配“shipDate”大于给定日期的货件。
- 查找“contents”中包含“id”与给定产品 ID 匹配的产品的条目
- 对每个匹配条目的“数量”值求和
- 返回总和
到目前为止,这是我为 Mongo 查询提出的:
db.shipment.aggregate([
{$match: {"shipDate": {$gt: ISODate("2019-01-01")}}},
{$unwind: "$packages"},
{$unwind: "$packages.contents"},
{$unwind: "$packages.contents.product"},
{
$project: {
matchedProduct: {
$filter: {
input: "$packages.contents.products",
as: "products",
cond: {
"$eq": ["$products.id", ObjectId("5fb55eae3fb1bf783a4fa97f")]
}
}
}
}
}
])
查询有效,但似乎只返回满足 $match 条件且“products”值为 null 的所有条目。
我对 Mongo 查询很陌生,所以它可能是一个简单的解决方案。但是,我一直无法弄清楚如何返回匹配产品 ID 的“内容”数量字段的 $sum。
任何帮助将不胜感激,谢谢。
解决问题的查询
db.shipment.aggregate([
{
$match: {
"shipDate": {$gte: ISODate("2019-01-01")},
"packages.contents.product.$id": ObjectId("5fb55eae3fb1bf783a4fa98e")
}
},
{ $unwind: "$packages" },
{ $unwind: "$packages.contents" },
{ $unwind: "$packages.contents.product" },
{
$match: {
"packages.contents.product.$id": ObjectId("5fb55eae3fb1bf783a4fa98e")
}
},
{
$group: {
"_id": null,
"total": {
"$sum": "$packages.contents.quantity"
}
}
}
])
【问题讨论】:
标签: database mongodb filter aggregation