2016-12-01 1 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는 항상 전체 db 조회를 수행해야합니다.

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 이상에서 제공됩니다.

관련 문제