更新架构声明后,Mongoose 不会更新新字段

Posted

技术标签:

【中文标题】更新架构声明后,Mongoose 不会更新新字段【英文标题】:Mongoose won't update new field after updating schema declaration 【发布时间】:2015-12-15 04:35:27 【问题描述】:

我刚刚注意到,当我更新我的架构定义并添加一个字段时,例如“名称:字符串”,然后尝试使用

People.update(  _id: user_id ,  $set:  name: 'something'   ) 

mongoose 不会更新我的属性。

我不断收到 nModified: 0 的响应。

我发现修复它的唯一方法是删除集合,然后新文档将完美运行。

我错过了什么吗? mongoose 是否以某种方式“缓存”了 mongodb 本身的集合模式,然后需要“删除”以“重新加载”属性?

【问题讨论】:

不,MongoDB 中没有存储模式定义。但是,如果您将属性设置为已经存在的值,mongodb 将报告 0 已修改,因为没有可修改的内容。您还说您正在更新架构定义,但是您是否在更改之间重新启动应用程序?您是否启用了此处未提及的其他插件。确定的最好方法是启用调试 `mongoose.set("debug",true)。然后您将查看发送的方法调用是否与您正在调用的不同。但请先检查其他事项。 【参考方案1】:

我认为 findbyidandupdate 会为您完成任务。试试这个链接

Mongoose - findByIdAndUpdate - doesn't work with req.body

【讨论】:

【参考方案2】:

您能否分享您的人物模型,也请使用回调更新。

见下文,工作正常..

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var User = mongoose.model('User',  email: String, name: String );
//First added only email and used save to save the document.
//var user = new User( email: 'john.due@example.com' );
User.update( _id: '55fbbb268e7307dc0bf9ae92' ,  $set:  name: 'John Due' , function(err, result) 
    if(err) throw err;
    console.log(result)
 );

【讨论】:

当设置为某个 _id 时它工作正常,但是当它设置为“null”或“undefined”时,它并没有为我更新。更新说 nModified 0 在删除集合并再次创建它之后它可以工作,这让我感到困惑和担心,因为我无法在生产中删除集合。

以上是关于更新架构声明后,Mongoose 不会更新新字段的主要内容,如果未能解决你的问题,请参考以下文章

mongoose/mongodb 不会用 PUT 更新

更新猫鼬模式后,新输入的字段未插入已创建的集合中

子模式属性不更新猫鼬

Mongoose 子文档不会更新

向架构添加新字段后如何更新旧文档?

当我“更新”时,Mongoose 操作字段是“查找”,为啥?