我的项目使用MongoDB和NodeJS(带有Mongoose(。
我有一个名为places
的不断增长的大型集合,其中每个place
都有一个GeoJSON属性,包含其lat/lon坐标;以及zones
的第二静态集合,每个集合包含指定zone
的轮廓的GeoJSON多边形。我需要为每个新的place
添加一个属性matching_zones
,它列出了与其位置相交的zone
文档。
我目前正在通过一个自动任务来完成这项工作,该任务执行以下操作:
- 从
places
中检索流中尚未具有zones
属性的所有文档(我使用的是StreamWorker
NodeJS模块,它允许我调整并发级别( - 对于每个文档,在
zones
集合中查找此place
的位置$geoIntersect
与zone
的多边形一致的所有文档 - 更新文档并告诉
StreamWorker
已完成处理
至少在更新方面,这是相对低效的,所以我打算将其修改为使用unorderedBulkOp
进行更新,这样我就设置了一个批量操作,每N个文档我执行一次批量操作并启动一个新的操作,然后当所有文档都处理完后,我执行最后的批量操作。
我想知道的是:有没有办法以某种方式将Node从循环中删除?我已经使用了MongoDB聚合管道的$lookup
操作符,效果非常好,我想知道是否可以在更新操作中进行类似的操作。
经过进一步的挖掘和实验,我得出了这样的结论:不,这是不可能的。Mongo 4.2允许您将聚合管道合并到findAndUpdate
命令中,但不支持$lookup
阶段。
如果有人知道其他一些聪明的技巧,那就太棒了,所以要等几天才能把它标记为正确的。