我有一个带有 virtual 引用的模式的模式:
User.virtual('stuffs', {
ref: 'Stuff',
localField: '_id',
foreignField: 'owner',
options: {},
});
当新用户注册时,我还会为其生成一些相关的 stuff ,并且我想返回填充了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
函数的工作方式是查询 stuff 集合以查找所有者为user._id
的文档,就像上面命令中保存的文档一样
我已经读过Mongodb只是最终一致的,这是否意味着查询可能失败并且找不到刚刚保存的 stuff ?如果是这样,机会是什么?我真的需要验证人口成功吗?我应该添加多次尝试的重试循环吗?
谢谢。
答案 0 :(得分:0)
除非您正在从辅助副本中进行读取,否则您应该没事。来自https://www.mongodb.com/faq#consistency:
默认情况下,MongoDB是一致的:读取和写入都会发布到 副本集的主要成员。应用程序可以选择从中读取 辅助副本,默认情况下最终数据是一致的。 从次级读取可能在以下情况下很有用 可接受数据稍有过时的数据,例如某些报告 应用程序。应用程序还可以从最近的副本中读取 延迟更重要时的数据(通过ping距离衡量) 而不是一致性。
因此,除非您写入一个数据库并从其副本中读取,否则不会出现填充问题。