首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬更新()真正更新了什么?

猫鼬更新()真正更新了什么?
EN

Stack Overflow用户
提问于 2016-10-04 08:41:58
回答 1查看 98关注 0票数 0

Mongoose文档提及这个示例代码:

代码语言:javascript
复制
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已经“大”了呢?

我之所以问这个问题,是因为猫鼬博士对此并不十分清楚,我想了解“猫鼬”是如何设计和打算在这方面使用的。

EN

回答 1

Stack Overflow用户

发布于 2016-10-04 09:33:01

一些测试表明,Mongoose跟踪对文档的修改(正如您已经提到的,通过使用setter),并将运行$set的新值的更新。

所以这个:

代码语言:javascript
复制
tank.size = 'large';
tank.save(...);

是否(粗略地说)实施为:

代码语言:javascript
复制
tankCollection.update({ _id : tank._id }, { $set : { size : 'large' } }, ...);

如果size的前一个值也是large,它将不会执行更新。另外,如果文档是新的,它将运行一个不同的代码路径(调用tankCollection.insert())。

因此,并发更新应该可以工作,只要它们不更新相同的属性(在这种情况下,最后执行的更新获胜)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39847809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档