db知道“时间”正在递增。mongodb-如何更快地找到最接近的值
这是我做:
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(结束)搜索。
db知道“时间”正在递增。mongodb-如何更快地找到最接近的值
这是我做:
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(结束)搜索。
您是否在time
属性上创建了索引?如果你错过了它,那么mongo将永远被迫做整个数据库查找。
要知道有多少个文件mongo检查运行db.collection_name.find({ time: { $gt: 50 } }).explain()
。 nscannedObjects
,cursor
属性将指示它是否搜索整个数据库或只有一个子集。
如果你有索引并且它工作的很慢,也可能你的索引不适合内存。更多关于它可以在这里找到:https://docs.mongodb.com/v3.2/tutorial/ensure-indexes-fit-ram/
如果你只是想获得最接近的价值,这种聚集将做的工作:
var t = 12;
db.test.aggregate([{
$project: {
time: 1,
diff: {
$abs: {
$subtract: [t, '$time']
}
}
}
}, {
$sort: {
diff: 1
}
}, {
$limit: 1
}
]);
注:$abs
只配备在蒙戈3.2或更高版本。
你想得到两个最接近的值,一个大一个,一个低一个或只是最接近的值? – Khang
我想得到两个,但获得衣柜价值是可以接受的。 – YuTse