0

Есть ли возможность в Mongodb обновить документ на основе запроса для «подсчета» документов в другой коллекции? Я ищу варианты, чтобы сделать его атомной операцией.Обновление документа на основе запроса в зависимости от другой коллекции

Чтобы быть более конкретным, следующие как две коллекции разработаны:

Книги (Сборник)

_id Имя isReviewed [Boolean]

Отзывы (Collection)

_id bookID [_id in Books collection] Комментарии

Я придумал этот дизайн, так как массив «Reviews» для книги будет продолжать расти и изменяться. Теперь необходимо установить флаг isReviewed в документе «Книга» в «true», когда есть документ «Обзор». созданный для соответствующей Книги. Флаг останется «истинным», пока существует хотя бы один связанный обзор, существующий для книги.

Тот же флаг будет установлен на «ложный», если для книги нет отзывов. (Значением по умолчанию для флага является «false» при создании документа Doc.) Когда обзор удален, подсчет отзывов для книги рассчитан на то, можно ли установить значение «false». (если число равно 0, затем установите значение false).

Эта система предназначена для многопользовательской среды, использующей все ресурсы, такие как книги и обзоры. Все пользователи получают права на чтение/запись для всех ресурсов. (Я знаю, что это звучит странно, чтобы позволить всем пользователям создавать/читать/редактировать/удалять все обзоры, но, предположим, это так функционально).

Теперь, учитывая приведенный выше случай, как я могу выполнить обновление, связанное с установкой флага «isReviewed» на основе «count» в коллекции «Reviews»?

Это случай, который не может быть разрешен без транзакций (я имею в виду, нужны ли мне РСУБД)? Я открыт для реорганизации моих коллекций.

Любая помощь приветствуется, спасибо

+0

Я думаю, что ваш единственный жизнеспособный вариант (там, где операция остается атомарной) вложенные документы обзора рассматриваются как поддокументы книг. – bardzusny

+0

@bardzusny Спасибо за ответ. Я рассмотрел этот вариант, прежде чем придумал этот проект, имея две коллекции. Как я упоминал в вопросе, мне нужны были две коллекции, так как «Рецензии» будут продолжать расти и изменяться. – Vsoma

ответ

0

поскольку MongoDB обеспечивает AUTOMICITY на уровне документа, Вы можете предварительно присоединиться книги и обзоры коллекции, как показано ниже:

db.Books.insert(
{ 
"_id" : 1, 
"Name": "ABC", 
"reviews": [ ], 
"count" : 0 

}

PS: размер вашего документа должен быть не более 16 МБ в MAX. , если вы ожидаете, что ваши «обзоры» будут более того, вам придется разделить на две части и обработать случай в вашем коде.

+0

Спасибо за ответ. Я понимаю, что на самом деле, мой случай - это то, где массив «Обзоры» будет продолжать расти и должен иметь возможность выполнять операции CRUD для элементов массива. (Как я уже упоминал в своем вопросе). Когда вы делаете два сборника, вы упомянули, что мне нужно обработать в моем коде.Не могли бы вы дать мне пример кода? Я все делаю это, если это помогает мне поддерживать мои данные. я ценю вашу помощь – Vsoma

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