我有这个简化模式的文档:
{
positon: 10,
value: 5,
count: 3
}
我想要计算的是按position
对这些文档进行分组,并查找计数大于4但value
小于最小值value
的最大value
{ {1}}计数小于4。
这就是我所做的,但它不起作用:
{ $group: {
_id: {
position: "$position",
},
result: {$max: { $cond: [ {$and: [ {$gte: ["$count", 4]},
{$lt: ["$value", {$min: { $cond: [ {$lt: ["$count", 4]},
{ value: "$value" },
10]
}
}]
}]},
{ value: "$value", nb: "$count"},
0]
}
}
}
}
我说$min
是一个无效的运算符,我无法弄清楚如何编写正确的聚合函数。运行mapreduce会更好吗?
例如,如果我有这些文件
{Position: 10, value: 1, count 5}
{Position: 10, value: 3, count 3}
{Position: 10, value: 4, count 5}
{Position: 10, value: 7, count 4}
我希望reslt
{Position: 10, value: 1, count 4}
因为它是'value'的最大值,其中count大于4,但是因为值3只有3个计数,所以值4不是我想要的。
答案 0 :(得分:2)
至少可以说这有点令人满口,但我还有另外一个解释它的方法:
你想:
对于每个"职位" value查找其值为"值的文档"小于最大的"值"带有" count"的文件少于四个,他们自己"计数"实际上大于4。
这读起来像是一个数学考试问题,旨在让你迷惑逻辑。但要抓住这个含义,然后按照以下步骤执行聚合:
db.positions.aggregate([
// Separate the values greater than and less than 4 by "Position"
{ "$group": {
"_id": "$Position",
"high": { "$push": {
"$cond": [
{ "$gt": ["$count", 4] },
{ "value": "$value", "count": "$count" },
null
]
}},
"low": { "$push": {
"$cond": [
{ "$lt": ["$count", 4] },
{ "value": "$value", "count": "$count" },
null
]
}}
}},
// Unwind the "low" counts array
{ "$unwind": "$low" },
// Find the "$max" value from the low counts
{ "$group": {
"_id": "$_id",
"high": { "$first": "$high" },
"low": { "$min": "$low.value" }
}},
// Unwind the "high" counts array
{ "$unwind": "$high" },
// Compare the value to the "low" value to see if it is less than
{ "$project": {
"high": 1,
"lower": { "$lt": [ "$high.value", "$low" ] }
}},
// Sorting, $max won't work over multiple values. Want the document.
{ "$sort": { "lower": -1, "high.value": -1 } },
// Group, get the highest order document which was on top
{ "$group": {
"_id": "$_id",
"value": { "$first": "$high.value" },
"count": { "$first": "$high.count" }
}}
])
所以从文件集中:
{ "Position" : 10, "value" : 1, "count" : 5 }
{ "Position" : 10, "value" : 3, "count" : 3 }
{ "Position" : 10, "value" : 4, "count" : 5 }
{ "Position" : 10, "value" : 7, "count" : 4 }
在这种情况下只返回第一个,因为它的值小于"三个"记录其自身计数大于4的文档。
{ "_id" : 10, "value" : 1, "count" : 5 }
我确信这就是你的意思。
因此$min
和$max
的应用实际上仅适用于从分组范围中获取文档中的离散值。如果您对文档或整个文档中的多个值感兴趣,那么您排序并在分组边界上获取$first
或$last
条目。< / p>
聚合比mapReduce快得多,因为它使用本机代码而不调用JavaScript解释器。