2016-12-01 103 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或更高版本。