查询以获取“所有”文档具有特定值的记录

时间:2017-07-12 22:14:44

标签: mongodb mongodb-query aggregation-framework

我在解决以下问题时遇到问题:

{ "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。

2 个答案:

答案 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

我希望我能帮到你;)