Мой проект использует MongoDB и NodeJS (с понедельником goose).
У меня есть большая и постоянно растущая коллекция под названием places
, где каждый place
имеет Geo JSON свойство, содержащее его координаты широта / долгота; и второй, stati c, набор zones
, каждый из которых содержит многоугольник Geo JSON, определяющий контур zone
. Мне нужно добавить свойство matching_zones
к каждому новому place
, в котором перечислены zone
документы, с которыми пересекается его местоположение.
В настоящее время я делаю это с помощью автоматизированной задачи, которая выполняет следующее:
- Получить все документы из
places
, которые еще не имеют свойства zones
в потоке (я использую модуль StreamWorker
NodeJS, который позволяет мне настроить уровень параллелизма) . - Для каждого документа найдите все документы в коллекции
zones
, где это местоположение place
$geoIntersect
с многоугольником zone
. - Обновите документ и скажите
StreamWorker
, что он завершил обработку.
Это относительно неэффективно, по крайней мере, со стороны обновления, поэтому я собирался изменить его, чтобы использовать unorderedBulkOp
для обновлений, так что я установил массовую операцию, и каждый N документов я выполняю массовую операцию и запускаю новую, а затем, когда все документы обработаны, я выполняю заключительную массовую операцию.
Что мне интересно, так это: есть ли способ вывести Node из л oop каким-то образом здесь? Я очень хорошо использовал оператор конвейера агрегации MongoDB $lookup
, и мне интересно, можно ли что-то подобное сделать в операции обновления.