假设我有一个集合,其中的文档具有一个浮点数的ratio属性.

{'ratio':1.437}

如何编写一个查询来查找与给定整数最接近的单个文档,而不使用驱动程序将它们全部加载到内存中,并查找最小值为abs(x-ratio)的文档?

推荐答案

有趣的问题.我不知道你是否可以在一个查询中完成,但你可以在两个查询中完成:

var x = 1; // given integer
closestBelow = db.test.find({ratio: {$lte: x}}).sort({ratio: -1}).limit(1);
closestAbove = db.test.find({ratio: {$gt: x}}).sort({ratio: 1}).limit(1);

然后,只需判断两个文档中哪个文档的ratio最接近目标整数.

MongoDB 3.2 Update

3.2版本增加了对$abs绝对值聚合运算符的支持,现在可以在单个aggregate查询中完成这一操作:

var x = 1;
db.test.aggregate([
    // Project a diff field that's the absolute difference along with the original doc.
    {$project: {diff: {$abs: {$subtract: [x, '$ratio']}}, doc: '$$ROOT'}},
    // Order the docs by diff
    {$sort: {diff: 1}},
    // Take the first one
    {$limit: 1}
])

Mongodb相关问答推荐

获取响应周期中的特定键和值

Mongoose 排除数组中包含特定嵌套对象的文档

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

Mongo查找条件:不存在

分页时根据唯一字段mongodb获取数据

MongoDB:如何将所有文档合并到聚合管道中的单个文档中

Mongo 删除最后的文件

Raft Vs MongoDB 初选

连接到远程 mongo 服务器导致异常连接失败

pymongo 排序和 find_one 问题

使用 mgo 存储嵌套 struct

Mongoose 是否真的验证了对象 ID 的存在?

移动 MongoDB 的数据文件夹?

Mongoose 版本控制:when is it safe to disable it?

无法连接到远程服务器上的 mongo

如何在mongoDB中检索其值以特定字符结尾的文档

Mongoid 不在查询中

使用 Mongoose ORM 的杀手锏是什么?

Mongodb 查找除一两个条件之外的所有内容

mongodb & max connections最大连接数