pyMongo嵌套除,gt

时间:2018-01-19 20:29:09

标签: python mongodb-query aggregation-framework pymongo

我有一个带有字段"磁盘"的文档。就这样:

"host": "localhost"
"disk":[
                {
                    "dir": "/var",
                    "capacity": 6291456,
                    "used": 291456
                },
                {
                    "dir": "/tmp",
                    "capacity": 6291456,
                    "used": 1365386
                }
            ]

我正在尝试编写一个查询来选择使用百分比大于90%的服务器。我需要嵌套gt和除功能,但我不能让它工作。

基本上它需要是:

for item in disk:
    if used/capacity > .9:
        return document

我试过了:

db.servers.find({ 'disk': { '$elemMatch' : { '$expr': { '$gt' : [{'$divide': {'used': 'capacity'}}, 0]  } } } }) 

将gt值设置为0,因此它应该返回所有内容仅用于测试,但它什么也没有返回。

这个的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

您必须在$filter表达式中使用$expr运算符。您不能在$ expr中使用查询运算符($elemMatch)。 $expr仅允许聚合运算符。

$gt来检查匹配记录的$size何时大于0

这样的东西
db.servers.find(
{"$expr":{
  "$gt":[
    {"$size":{
      "$filter":{
        "input":"$disk",
        "as":"item",
        "cond":{
          "$gt":[
            {"$divide":["$$item.used","$$item.capacity"]},
            0.9
          ]
        }
      }
    }},
    0
  ]
}})