我在解决以下问题时遇到问题:
{ "dg" : "dg4", "r": -1 }
{ "dg" : "dg4", "r": -1}
{ "dg" : "dg3", "r":-1}
{ "dg" : "dg3", "r":-1}
{ "dg" : "dg2", "r": -1}
{ "dg" : "dg2", "r":100}
{ "dg" : "dg1", r:200}
{ "dg" : "dg1", r:201}
{ "dg" : "dg0", "r":-1}
{ "dg" : "dg0", "r":-1}
{ "dg" : "dg0", "r":2}
现在我想按每个“dg”分组查询并确保所有它的“r”为-1否则不返回该dg。 在上面的例子中,我想要“dg4”和“dg3”,因为dg3,dg4都将“all”$ r设为-1。
答案 0 :(得分:0)
你基本上需要在构造之后比较“集合”。所以$group
然后是$redact
,其中元素包含除所需值之外的任何内容:
db.collection.aggregate([
{ "$group": {
"_id": "$dg",
"rValues": { "$push": "$r" }
}},
{ "$redact": {
"$cond": {
"if": {
"$eq": [ { "$size": { "$setDifference": [ "$rValues", [-1] ] } }, 0 ]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
如果你真的对“完整”的一组值不感兴趣,那么你可以$addToSet
来保持阵列大小不变。
但是[-1]
的预期比较$setDifference
是决定返回内容的唯一值。
以上结果为:
{
"_id" : "dg4",
"rValues" : [
-1.0,
-1.0
]
}
{
"_id" : "dg3",
"rValues" : [
-1.0,
-1.0
]
}
答案 1 :(得分:0)
我可能有一个技巧可以用于你给出的例子。
当我理解至少有r
与-1
不同时,您必须排除结果。
那么为什么不这样做:
db.collection.aggregate([
{$group: {
_id: "$dg",
rm: {$min: "$r"}, // get minimum value of all r of the same dg
rM: {$max: "$r"} // get maximum value of all r of the same dg
}},
{$match: {
rm: {$ne: -1}, // filter out when other value than -1
rM: {$ne: -1} // filter out when other value than -1
}}
]);
因此,您排除所有没有最小和最大r等于-1
的值;所以排除所有女巫至少有一个r
值不同于-1
。
我希望我能帮到你;)