假设我有这些文件:
{_id:1, value:2.21}
{_id:2, value:2.23}
然后,如果我收到一个2.24的参数,我想返回文件,其中abs(2.24-value)< = 0.01这具体地只返回带有_id的文档:2
所以一般来说我想要文件,其中abs(value-parameter)< = x
谢谢。
答案 0 :(得分:3)
这可以是一个简单db.coll.find()
$gte
和$lte
> var foo = 2.24;
> var difference = 0.0100000000001
> db.numbers.find({value:{$gte: (foo - difference), $lte: (foo + difference)}})
{ "_id" : 2, "value" : 2.23 }
唯一的问题是MongoDB使用浮点运算,这意味着如果difference
设置为0.01,foo - difference
的结果可能类似于2.23000000000000004(这将错过第二个文档)。这就是为什么我将它设置为仅仅高于我们实际需要的差异的原因。
答案 1 :(得分:0)
您无法直接进行ABS操作。但是你可以使用条件运算符$cond
。
db.numbers.aggregate([{
$project: {
value: {
$subtract: [2.24,
{$cond: [{$lt: ['$value', 0]},
{$subtract: [0, '$value']},
'$value']
}
]
}
}
}, {
$match: {
value: {$lte: 0.01}
}
}]);
使用aggregate
命令执行操作,第一步是完成绝对值的投影,第二步是完成条件。
请注意,您可能需要舍入绝对结果以获得预期结果。