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(结束)。
答案 0 :(得分:1)
您是否在time
属性上创建了索引?如果你错过了它,那么mongo将永远被迫进行整个数据库查找。
要知道mongo检查了多少文件db.collection_name.find({ time: { $gt: 50 } }).explain()
。 nscannedObjects
,cursor
属性将指示它是连接整个数据库还是只有一个子集。
如果你有索引并且它运行缓慢,你的索引也可能不适合内存。有关它的更多信息,请访问: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或更高版本。