首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询取“所有”单据具有某一值的记录

查询取“所有”单据具有某一值的记录
EN

Stack Overflow用户
提问于 2017-07-13 06:14:44
回答 2查看 27关注 0票数 1

我在为以下内容构建查询时遇到问题:

代码语言:javascript
复制
{ "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。

EN

回答 2

Stack Overflow用户

发布于 2017-07-13 06:43:05

基本上,您需要在构造“集合”之后对它们进行比较。因此,先执行$group,然后执行$redact,其中元素包含的值不是所需的值:

代码语言:javascript
复制
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,作为唯一的值,它决定返回什么。

上面的结果如下所示:

代码语言:javascript
复制
{
    "_id" : "dg4",
    "rValues" : [ 
        -1.0, 
        -1.0
    ]
}


{
    "_id" : "dg3",
    "rValues" : [ 
        -1.0, 
        -1.0
    ]
}
票数 0
EN

Stack Overflow用户

发布于 2017-07-13 16:47:25

我可能有一个技巧可以用在你给出的例子中。

据我所知,当至少有一个r-1不同时,您必须排除结果。

那么为什么不这样做呢:

代码语言:javascript
复制
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不同的值。

我希望我对您有所帮助;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45068366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档