Mongoose文档提及这个示例代码:
Tank.findById(id, function (err, tank) {
if (err) return handleError(err);
tank.size = 'large';
tank.save(function (err, updatedTank) {
if (err) return handleError(err);
res.send(updatedTank);
});
});这是导致MongoDB 更新()命令设置的结果,只是size属性(即db.tanks.update({_id: tank._id}, {$set: {size: "large"}});),还是替换了整个文档?
或者,换句话说,如果另一个客户机在findById()返回之后,在执行save()之前更新另一个属性(比方说,findById()),会怎么样?然后color是否恢复到以前的值,还是保持原样?
而且,如果“猫鼬”聪明到只更新“更改”属性,那么如何准确地检测到该属性(值是在前后比较的)?还是通过tank对象上的设置器?)?如果坦克size已经“大”了呢?
我之所以问这个问题,是因为猫鼬博士对此并不十分清楚,我想了解“猫鼬”是如何设计和打算在这方面使用的。
发布于 2016-10-04 09:33:01
一些测试表明,Mongoose跟踪对文档的修改(正如您已经提到的,通过使用setter),并将运行$set的新值的更新。
所以这个:
tank.size = 'large';
tank.save(...);是否(粗略地说)实施为:
tankCollection.update({ _id : tank._id }, { $set : { size : 'large' } }, ...);如果size的前一个值也是large,它将不会执行更新。另外,如果文档是新的,它将运行一个不同的代码路径(调用tankCollection.insert())。
因此,并发更新应该可以工作,只要它们不更新相同的属性(在这种情况下,最后执行的更新获胜)。
https://stackoverflow.com/questions/39847809
复制相似问题