2016-12-01 106 views
0

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(結束)搜索。

+0

你想得到兩個最接近的值,一個大一個,一個低一個或只是最接近的值? – Khang

+0

我想得到兩個,但獲得衣櫃價值是可以接受的。 – YuTse

回答

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/

0

如果你只是想獲得最接近的價值,這種聚集將做的工作:

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

注:$abs只配備在蒙戈3.2或更高版本。