【发布时间】:2014-02-16 09:18:25
【问题描述】:
例如,我有以下文件:
{
"_id" : ObjectId("52ffddd3c69e40174c046d67"),
"works" : [
{
"service_id" : ObjectId("52ffd576c69e40174c046d64"),
"price" : 150,
"count" : 3,
"items" : [
{
"price" : 5,
"amount" : 10
},
{
"price" : 7,
"amount" : 3
}
]
},
{
"service_id" : ObjectId("52ffd56fc69e40174c046d63"),
"price" : 100,
"count" : 2
}
]
}
其中 service_id 指的是一些外部文档(我知道,不推荐),price 是工作的价格,count 是工作已执行的次数,item 是材料的数组,用于all强>有效。 我需要得到所有作品的总价。我尝试了以下未完成的代码:
db.service_cards.aggregate(
{ $match: {_id: ObjectId("52ffddd3c69e40174c046d67") } },
{ $unwind: "$works" },
{ $project: {
"works.service_id": 1,
"works.price": 1,
"works.count": 1,
"works.items": {
"$cond": [
{ $eq: [ "$works.items", []] },
[{
"price": 0,
"amount": 0
}],
"$works.items"
],
}
} },
{ $project: {
"works.service_id": 1,
"works.price": 1,
"works.count": 1,
"works.items": {
"$ifNull": [
"$works.items",
[{
"price": 0,
"amount": 0
}]
],
}
} },
{ $unwind: "$works.items" },
{ $project: {
"service_id": "$works.service_id",
"price": "$works.price",
"count": "$works.count",
"items_cost": { $multiply: ["$works.items.price", "$works.items.amount"] },
} },
{ $group: {
_id: "$service_id",
"sum_items": { $sum: "$items_cost" },
"price": { $avg: "$price" },
"count": { $avg: "$count" }
} }
)
它实际上并不对数组求和 - 它展开作品和项目,然后使用 $group 对展开的项目求和。但后来我想起来了——可能有两幅作品的 service_id、count 和 price 相同,在 $unwind 和 $group 之后,我会丢失其中一个,将两者的项目放在一起。
有没有办法在没有 $unwind 的情况下在文档中获取数组 $sum?
编辑: 我希望收到一份不含物品但包含物品总成本的作品清单:
{
"_id" : ObjectId("52ffddd3c69e40174c046d67"),
"works" : [
{
"service_id" : ObjectId("52ffd576c69e40174c046d64"),
"price" : 150,
"count" : 3,
"items_cost" : 71
},
{
"service_id" : ObjectId("52ffd56fc69e40174c046d63"),
"price" : 100,
"count" : 2,
"items_cost": 0
}
]
}
【问题讨论】:
-
简短的回答是否定的。长答案取决于您期望做什么并作为结果文档接收。您的问题尚不清楚。也许如果您添加了您想要和期望的内容,那么人们可以帮助您解决问题。通过添加我们的意思是,编辑您的问题以包含它并使事情变得清晰。