2015-06-15 2 views
1

проблема

У меня есть потенциально большой запрос на поиск, который должен быть остановлен, когда выполняются условия моего сервера «javascript», например, у моего сервера уже есть документы для определения решения.Метеор js курсор hasNext() и next()?

Идея здесь состоит в том, чтобы перебирать курсор из монго, ударяя монго «по требованию», любопытное «потоковое», поэтому ни мой сервер, ни монго не должны получать сразу все результаты.

ожидаемого поведения

  • запрос и получить курсор (г = Collection.find())
  • проверки на следующем (r.hasNext())
  • выборки в следующем (r.next())
  • раз мои требования будут выполнены, остановка (удаление г)

пример кода

Collection.find().forEach(function(doc) { 
    doc = do_my_business(doc); 
    if (doc.found) { 
    // hey mister cursor, go home and die! don't touch my mongo anymore! 
    return false; 
    } 
}); 

реальная проблема

я создал еще один вопрос, который на самом деле, как я в конечном итоге здесь: https://stackoverflow.com/questions/30836586/mongodb-find-near-until-maxdistance-or-at-least-x-records

+0

Короткий ответ: нет. Длинный ответ: возможно, вы могли бы выполнить этот другой способ, например, с помощью запроса 'where' или агрегации. Это зависит от бизнес-логики. –

+0

Я пытаюсь найти решение «mongo way», но пока не так много удачи. Я также открыл для этого вопрос: http://stackoverflow.com/questions/30836586/mongodb-find-near-until-maxdistance-or-at-least-x-records – kroe

+0

Кажется, что вы можете просто сделать var count = Collection.find (selectorWithDistance) .count() ', то если' count' недостаточно, попробуйте еще раз с другого расстояния. –

ответ

1

Метеор курсор не является Монго курсор. Метеорные курсоры не имеют hasNext или next. Итак, это действительно просто вопрос о forEach, который аналогичен ES5 forEach. Итак, вот что вы можете сделать:

1. Извлеките все документы в массив & запустите цикл for, перерыв при выполнении критериев.

2.Turn флаг, когда критерии встретили & проверки в начале функции:

if (isHappy) return; 
doc = do_my_business(doc); 
if (doc.found) isHappy = true; 

3. Использовать петлю попытки поймать:

foo = {}; 
try { 
    Collection.find().forEach(function(doc) { 
    doc = do_my_business(doc); 
    if (doc.found) { 
     throw foo; 
    } 
    }); 
} catch(e) { 
    if (e !== foo) { 
    throw e; 
    } 
} 

4.Forget в Foreach мусор & используйте $where с findOne + (сделайте find().limit(1).explain(), чтобы вы могли видеть, что он не тронет каждый документ.)

5. Храните что-то в своей базе данных, поэтому вам не нужно использовать javascript для курсора. Повторение цикла javascript над каждым доком на сервере следует избегать, как чума. Хранение дешево. обработки, не так много.

+0

Я не хочу забирать все документы заранее, а также иметь серверную логику - это требование для моего решения. – kroe

+0

Я мог бы использовать указатель mongodb в той же коллекции и делать трюк с «обычным драйвером» mongodb. Мне любопытно, что большинство ответов, которые я нашел в Интернете, «берут все документы» или используют синхронный forEach (поэтому выбирают все документы), возможно, я не хватает точки ... – kroe

Смежные вопросы