📅  最后修改于: 2023-12-03 14:44:23.165000             🧑  作者: Mango
在使用Mongoose时,我们可能会遇到更新数组中的值的问题。不管怎样更改,Mongoose似乎都不会更新数据库中的值。这是由于Mongoose默认情况下使用深度克隆对象,以防止不必要的更改。
您可以使用$set操作符,通过将新值直接放入要更改的位置来更新数组中的值。例如:
MyModel.updateOne({_id: id}, {$set: {'myArray.1': 'newVal'}}, function(err, result) {...});
该代码会将数组myArray
中索引为1的元素更新为'newVal'
。
另一种方法是在更新前使用.lean()
来将Mongoose模型转换为原始值,然后将更新后的值直接保存回数据库。例如:
MyModel.findById(id).lean().exec(function(err, doc) {
doc.myArray[1] = 'newVal';
MyModel.updateOne({_id: id}, doc, function(err, result) {...});
});
如果以上两种方法都不适用于您的情况,您可以考虑使用原始的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驱动程序直接更新数据库记录。