mongoose保存的问题
发布于 11 年前 作者 chihuohuo 9699 次浏览 最后一次编辑是 8 年前

上代码,定义了下面这个schema

var userSchema = new Schema({
     test:{type: String},
     email: {type: String},
     message: [{}], // 消息
});

mongodb中已有某条记录, ··· { “_id”: ‘5169abcsafdsf’, test: 111, email: ‘abc@ab.com’, message:[ {name: ‘aaa’, age: 12}, {name: ‘bbb’, age: 28} ] } ···

然后用save保存

userModel.findOne({test: 111}, '', {}, function(err, user){
	if(err) return err;
	user.email = 'emailValue';
	user.message[0].name = 'ccc';
	user.save();
});

最后发现email更新成功了, message始终不能更新成功!把我急的,有谁知道是什么原因吗,

3 回复

神了!我把保存的代码加一句不痛不痒的splice操作竟然可以更新成功,不加就失败!

	if(err) return err;
	user.email = 'emailValue';
	user.message[0].name = 'ccc';
	user.message.splice(0, 0);
	user.save();
});```
我去,这似肿么回事啊,求大侠解释!

google is always your friend.

搜索关键词mongoose field array update 为什么message更新不成功:http://stackoverflow.com/questions/13263562/unable-to-update-array-fields-in-mongoosejs

搜索关键词mongoose field array update splice 为什么splice后更新成功:http://mongoosejs.com/docs/api.html#types_array_MongooseArray-splice

整个过程耗时5分钟左右,英文水平牛的同学估计更快。

发现了问题所在,混合类型修改完必须调用markModified,社区中有一篇文有过解释:http://cnodejs.org/topic/504b4924e2b84515770103dd
splice能成功是因为 mongooseArray 内在调用了this._markModified(),发现不单是splice,包括unshift sort set等操作mongooseArray的方法在最后都会调用这个方法。 首先感谢 @shiedman 给出的链接及提示~! 结帖!

回到顶部