MongoDB: массовая операция, включающая поиск в коллекции? - PullRequest
0 голосов
/ 18 марта 2020

Мой проект использует MongoDB и NodeJS (с понедельником goose).

У меня есть большая и постоянно растущая коллекция под названием places, где каждый place имеет Geo JSON свойство, содержащее его координаты широта / долгота; и второй, stati c, набор zones, каждый из которых содержит многоугольник Geo JSON, определяющий контур zone. Мне нужно добавить свойство matching_zones к каждому новому place, в котором перечислены zone документы, с которыми пересекается его местоположение.

В настоящее время я делаю это с помощью автоматизированной задачи, которая выполняет следующее:

  1. Получить все документы из places, которые еще не имеют свойства zones в потоке (я использую модуль StreamWorker NodeJS, который позволяет мне настроить уровень параллелизма) .
  2. Для каждого документа найдите все документы в коллекции zones, где это местоположение place $geoIntersect с многоугольником zone.
  3. Обновите документ и скажите StreamWorker, что он завершил обработку.

Это относительно неэффективно, по крайней мере, со стороны обновления, поэтому я собирался изменить его, чтобы использовать unorderedBulkOp для обновлений, так что я установил массовую операцию, и каждый N документов я выполняю массовую операцию и запускаю новую, а затем, когда все документы обработаны, я выполняю заключительную массовую операцию.

Что мне интересно, так это: есть ли способ вывести Node из л oop каким-то образом здесь? Я очень хорошо использовал оператор конвейера агрегации MongoDB $lookup, и мне интересно, можно ли что-то подобное сделать в операции обновления.

1 Ответ

0 голосов
/ 18 марта 2020

Ну, некоторые дальнейшие раскопки и эксперименты приводят меня к выводу, что нет, это невозможно. Пн go 4.2 позволяет вам включить конвейер агрегации в команду findAndUpdate, но стадия $lookup не входит в число поддерживаемых.

В восторге, если кто-то знает о какой-то другой умной технике для этого , поэтому подождите пару дней, прежде чем пометить это как правильное.

...