конечная согласованность мангуста при заполнении виртуальных полей - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть схема с виртуальной ссылкой на другую модель:

User.virtual('stuffs', {
  ref: 'Stuff',
  localField: '_id',
  foreignField: 'owner',
  options: {},
});

Когда новый пользователь регистрируется, я также генерирую некоторые связанные вещи дляи я хочу вернуть пользовательский объект с заполненным полем stuffs, поэтому я делаю что-то вроде:

const user = await (new User(...).save());
const stuff = await (new Stuff({ owner: user._id }).save());
res.json({ user: (await user.populate('stuffs').execPopulate()).toObject({ virtuals: true }) });

Я предполагаю, что функция populate работает, запрашивая материал коллекция для документа, владельцем которого является user._id, точно так же, как тот, который был сохранен в приведенной выше команде.

Я читал, что Mongodb только в конечном итоге непротиворечив, означает ли это, чтозапрос может завершиться с ошибкой и не найти материал , который был только что сохранен?Если да, каковы шансы?Мне действительно нужно проверить, что население преуспело?Должен ли я добавить повторную петлю с несколькими попытками?

Спасибо.

1 Ответ

0 голосов
/ 19 декабря 2018

С вами все будет хорошо, если только вы не читаете из вторичной реплики.Начиная с https://www.mongodb.com/faq#consistency:

MongoDB согласован по умолчанию: операции чтения и записи выдаются первичному члену набора реплик.Приложения могут при желании читать из вторичных реплик, где данные в конечном итоге остаются согласованными по умолчанию .Чтения из вторичных серверов могут быть полезны в сценариях, где допустимо несколько устаревать данные, например, в некоторых приложениях для создания отчетов.Приложения также могут читать из ближайшей копии данных (измеряемой расстоянием между пингами), когда задержка важнее согласованности.

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

...