Nodejs mongoose 中 update 用 save 修改失效,是什么原因?
Nodejs mongoose 中 update 用 save 修改失效,是什么原因?
var mongoose=require(‘mongoose’);
var db=mongoose.connect(‘mongodb://localhost/words’);
var wordSchema=require(’./word_schema.js’).wordSchema;
var Words=mongoose.model(‘Words’,wordSchema);
mongoose.connection.once(‘open’,function(){
var query=Words.findOne().where(‘word’,‘book’);
query.exec(function(err,doc){
console.log(‘is document new? ‘+doc.isNew);
console.log(’\nbefore save:’);
console.log(doc.toJSON());
doc.set(‘word’,‘Book’);
doc.set(‘first’,‘B’);
console.log(’\nmodified fields:’);
console.log(doc.modifiedPaths());
doc.save(function(err,res){
console.log(res);
mongoose.disconnect();
// Words.findOne({word:‘Book’},function(err,res){
// console.log(’\nafter save:’);
// console.log(res);
// mongoose.disconnect();
// });
});
});
});
数据库: https://github.com/CHINQ/angularnodemongodb/blob/master/mongodb/data/generate_data.js word_schema.js : https://github.com/CHINQ/angularnodemongodb/blob/master/mongodb/word_schema.js
Model.update(query, update, {new: true}, function(err, result) {})
new: true 表示返回修改后的值
在 Node.js 中使用 Mongoose 进行数据库操作时,如果在尝试使用 save
方法更新文档而发现修改失效,通常可能是以下几个原因导致的:
-
文档未正确查询:确保你查询到的文档是你想要更新的那一个。如果查询条件不正确,可能会导致查询结果为空或不是预期的文档。
-
修改后的文档未重新赋值:Mongoose 的
save
方法是基于当前文档的_id
来保存修改的。如果直接修改了文档对象的属性但没有重新赋值给查询结果,这些修改可能不会被识别。 -
版本冲突:如果文档在查询后被其他操作修改过,可能导致版本冲突,使得你的修改无法保存。
正确的做法是使用 findOneAndUpdate
或 updateOne
方法来更新文档,而不是先查询再用 save
。这里是一个使用 findOneAndUpdate
的例子:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
name: String,
age: Number
});
const User = mongoose.model('User', userSchema);
User.findOneAndUpdate(
{ name: 'John Doe' }, // 查询条件
{ age: 30 }, // 更新内容
{ new: true }, // 返回更新后的文档
(err, doc) => {
if (err) console.error(err);
console.log(doc);
}
);
这段代码会查询名为 ‘John Doe’ 的用户,并将其年龄更新为 30,同时返回更新后的文档。这样可以避免使用 save
导致的修改失效问题。