mongodb-如何更快地找到最接近的值

时间:2016-12-01 07:48:28

标签: mongodb

db知道"时间"正在上升。

这就是我所做的:

var t = 123;
var before = db.test.find({ "time": {$lte:t}});
var after = db.test.find({ "time": {$gt:t}});
before[before.size()-1]
after[0]

但是,当数据库非常庞大时,它非常耗时!

似乎db从_id(开始)搜索到_id(结束)。

2 个答案:

答案 0 :(得分:1)

您是否在time属性上创建了索引?如果你错过了它,那么mongo将永远被迫进行整个数据库查找。

要知道mongo检查了多少文件db.collection_name.find({ time: { $gt: 50 } }).explain()nscannedObjectscursor属性将指示它是连接整个数据库还是只有一个子集。

如果你有索引并且它运行缓慢,你的索引也可能不适合内存。有关它的更多信息,请访问:https://docs.mongodb.com/v3.2/tutorial/ensure-indexes-fit-ram/

答案 1 :(得分:0)

如果您只想获得最接近的值,则此聚合将完成此任务:

var t = 12;
db.test.aggregate([{
    $project: {
      time: 1,
      diff: {
        $abs: {
          $subtract: [t, '$time']
        }
      }
    }
  }, {
    $sort: {
      diff: 1
    }
  }, {
    $limit: 1
  }
]);

注意:$abs仅适用于Mongo 3.2或更高版本。