填充虚拟字段时猫鼬最终的一致性

时间:2018-12-19 00:32:57

标签: mongodb mongoose mongoose-populate eventual-consistency

我有一个带有 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 ?如果是这样,机会是什么?我真的需要验证人口成功吗?我应该添加多次尝试的重试循环吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

除非您正在从辅助副本中进行读取,否则您应该没事。来自https://www.mongodb.com/faq#consistency

  

默认情况下,MongoDB是一致的:读取和写入都会发布到   副本集的主要成员。应用程序可以选择从中读取   辅助副本,默认情况下最终数据是一致的。   从次级读取可能在以下情况下很有用   可接受数据稍有过时的数据,例如某些报告   应用程序。应用程序还可以从最近的副本中读取   延迟更重要时的数据(通过ping距离衡量)   而不是一致性。

因此,除非您写入一个数据库并从其副本中读取,否则不会出现填充问题。