我在为以下内容构建查询时遇到问题:
{ "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的$r都是-1。
发布于 2017-07-13 06:43:05
基本上,您需要在构造“集合”之后对它们进行比较。因此,先执行$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
]
}发布于 2017-07-13 16:47:25
我可能有一个技巧可以用在你给出的例子中。
据我所知,当至少有一个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不同的值。
我希望我对您有所帮助;)
https://stackoverflow.com/questions/45068366
复制相似问题