2016-05-13 5 views
2

У меня возникла ситуация, когда мне нужно сопоставить данные между двумя коллекциями.Найти первый документ после указанной даты

Я хочу получить время от документа в одной коллекции, а затем найти либо первый документ, который приходит или после этого времени в другой коллекции.

Времена, как правило, не выровнены, и могут быть случаи, когда между ними существует значительный промежуток времени.

В настоящее время я использую это (в Node.js, используя родной драйвер):

coll.find({ 'TimeIndex': 
       { 
        '$lt': new Date(startTime.getTime() + 1000*10), 
        '$gte': startTime 
       } 
      }); 

Но, запеченный в есть предположение, что будет точкой в ​​течение 10 секунд. А что, если нет? Тогда мне нужно сделать какой-то расширенный поиск?

Я мог бы удалить $ lt и просто взять первый отсортированный результат, но тогда я боюсь, что пространство поиска будет слишком большим, и оно будет очень медленным.

Есть ли лучший способ сделать это, что мне не хватает?

+2

Если вы ищете только один документ, вы можете использовать findOne вместо поиска, поскольку вы упомянули, что хотите получить первый документ после ввода. –

+1

Интересно, но, видимо, findOne устарел в пользу find(). Limit (1) –

+0

Да, имеет смысл, findOne останавливает сканирование, как только он получает первый документ, то же самое, что и ограничение 1. Я полагаю. Хотя я и не знал, что это устарело. –

ответ

0

Я думаю, что у вас есть хороший подход здесь, поскольку запрос пытается преодолеть определенный промежуток времени. Предполагая, что поле имеет индекс, я мог бы предложить увеличить временной промежуток, чтобы иметь очень безопасный буфер (и это зависит от загрузки данных) - например, 60 секунд.

Возможно, было бы лучше получить кучу совпадающих документов и обработать их на стороне клиента, чем пропустить что-то, и получить дополнительный кругооборот на сервер.

0

Вы пробовали что-то вроде этого?

coll.find({ 'TimeIndex': {'$gte': startTime}}) 
    .sort({ TimeIndex: 1 }) 
    .limit(1); 

Я не знаю о качестве, однако.

Если есть проблема с производительностью, ваш подход выглядит хорошо.