假设我有一个收藏品:
[
{
_id: product_a,
values: [
{ id: 1, value: 0 },
{ id: 2, value: 1 },
{ id: 3, value: 2 },
]
},
{
_id: product_b,
values: [
{ id: 1, value: 1 },
{ id: 2, value: 2 },
{ id: 3, value: 2 },
]
},
// etc ...
];
有没有办法通过聚合“值”子集的乘积来查询此集合?
如果我查询{values:[1,3]},我会得到类似的结果:
[
{
_id: product_a,
result: 0 // since 0 * 2 = 0
},
{
_id: product_b,
result: 2 // since 1 * 2 = 2
},
// etc ...
];
答案 0 :(得分:2)
以下是使用2.2聚合框架的方式,如何使用模式。请注意,如果id / value对以id作为键存储,则会更加简单。
您的汇总pipeline:
[
{
"$unwind" : "$values"
},
{
"$match" : {
"values.id" : {
"$in" : [
1,
3
]
}
}
},
{
"$project" : {
"_id" : 1,
"val1" : {
"$cond" : [
{
"$eq" : [
"$values.id",
1
]
},
"$values.value",
-1
]
},
"val3" : {
"$cond" : [
{
"$eq" : [
"$values.id",
3
]
},
"$values.value",
-1
]
}
}
},
{
"$group" : {
"_id" : "$_id",
"val1" : {
"$max" : "$val1"
},
"val3" : {
"$max" : "$val3"
}
}
},
{
"$project" : {
"_id" : 1,
"result" : {
"$multiply" : [
"$val1",
"$val3"
]
}
}
}
]
请注意,如果文档的结构是:
{_id: "product_x", values: [ {id1: value}, {id2: value} etc. ]}
现在从shell运行查询:
> db.collection.aggregate(pipeline)
或通过db.runCommand({"aggregate":"collection","pipeline":[...]})