Нет способа атомарно удалить + сохранить в разных коллекциях, насколько я могу судить (может быть, по замыслу?)
Да, это по замыслу. MongoDB явно не предоставляет соединения или транзакции. Удалить + Сохранить - это форма транзакции.
Есть ли передовая практика для этой ситуации?
У вас действительно есть два варианта низкой сложности, оба включают findAndModify
.
Вариант № 1: одна коллекция
Исходя из вашего описания, вы в основном строите очередь с некоторыми дополнительными функциями. Если вы используете одну коллекцию, вы используете findAndModify
для обновления статуса каждого элемента в процессе его обработки.
К сожалению, это означает, что вы потеряете это: ... что «входящая» коллекция может быть очень маленькой и быстрой, таким образом .
Вариант № 2: две коллекции
Другой вариант - это двухфазный коммит, использующий findAndModify
.
Посмотрите документы для этого здесь .
После обработки элемента в A вы устанавливаете поле, чтобы пометить его для удаления. Затем вы копируете этот предмет в B . После копирования в B вы можете удалить элемент из A .