我有一个字段"disk"的文档:
"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 时,它应该返回所有内容仅用于测试,但它不返回任何内容。
正确的语法是什么?
您必须
$expr
表达式中使用$filter
运算符。不能在$expr中使用查询运算符 ($elemMatch
(。 $expr
仅允许聚合运算符。
当匹配记录的$size
大于 0 时要检查的外部$gt
类似的东西
db.servers.find(
{"$expr":{
"$gt":[
{"$size":{
"$filter":{
"input":"$disk",
"as":"item",
"cond":{
"$gt":[
{"$divide":["$$item.used","$$item.capacity"]},
0.9
]
}
}
}},
0
]
}})