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