📜  mongoose 不会更新数组中的值 - Javascript (1)

📅  最后修改于: 2023-12-03 14:44:23.165000             🧑  作者: Mango

Mongoose 不会更新数组中的值 - Javascript

在使用Mongoose时,我们可能会遇到更新数组中的值的问题。不管怎样更改,Mongoose似乎都不会更新数据库中的值。这是由于Mongoose默认情况下使用深度克隆对象,以防止不必要的更改。

解决方法
方法1:使用 $set 操作符

您可以使用$set操作符,通过将新值直接放入要更改的位置来更新数组中的值。例如:

MyModel.updateOne({_id: id}, {$set: {'myArray.1': 'newVal'}}, function(err, result) {...});

该代码会将数组myArray中索引为1的元素更新为'newVal'

方法2:使用原始值

另一种方法是在更新前使用.lean()来将Mongoose模型转换为原始值,然后将更新后的值直接保存回数据库。例如:

MyModel.findById(id).lean().exec(function(err, doc) {
   doc.myArray[1] = 'newVal';
   MyModel.updateOne({_id: id}, doc, function(err, result) {...});
});
方法3:使用原始的 MongoDB 驱动程序

如果以上两种方法都不适用于您的情况,您可以考虑使用原始的MongoDB驱动程序,以直接打开MongoDB数据库并执行任何操作。例如:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/mydb';
MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  const dbo = db.db('mydb');
  const myArray = ['newVal'];
  dbo.collection('MyModel').updateOne({_id: id}, {$set: { 'myArray': myArray}}, function(err, result) {
    if (err) throw err;
    db.close();
  });
});
总结

Mongoose的深度克隆对象可以保护数据不被意外更改,但在某些情况下,它可能导致更新数组中的值的问题。您可以使用上述解决方法之一来解决此问题,或者考虑使用原始的MongoDB驱动程序直接更新数据库记录。