Nodejs mongoose 中 update 用 save 修改失效,是什么原因?

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

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


3 回复

Model.update(query, update, {new: true}, function(err, result) {})

new: true 表示返回修改后的值


在 Node.js 中使用 Mongoose 进行数据库操作时,如果在尝试使用 save 方法更新文档而发现修改失效,通常可能是以下几个原因导致的:

  1. 文档未正确查询:确保你查询到的文档是你想要更新的那一个。如果查询条件不正确,可能会导致查询结果为空或不是预期的文档。

  2. 修改后的文档未重新赋值:Mongoose 的 save 方法是基于当前文档的 _id 来保存修改的。如果直接修改了文档对象的属性但没有重新赋值给查询结果,这些修改可能不会被识别。

  3. 版本冲突:如果文档在查询后被其他操作修改过,可能导致版本冲突,使得你的修改无法保存。

正确的做法是使用 findOneAndUpdateupdateOne 方法来更新文档,而不是先查询再用 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 导致的修改失效问题。

回到顶部