更新mongodb记录中保存的数组中的值的最佳方法是什么?目前,我正在尝试这种方式:
Record.find({ 'owner': owner}, {}, {sort: { date: -1 }}, function(err, record){
if(!err){
for (var i = 0; i < record[0].array.length; i++){
record[0].array[i].score = 0;
record[0].array[i].changed = true;
record[0].save();
}
}
});
架构看起来像这样:
var recordSchema = mongoose.Schema({
owner: {type: String},
date: {type: Date, default: Date.now},
array: mongoose.Schema.Types.Mixed
});
现在,我可以看到数组更新,保存时没有错误,但是当我再次查询数据库时,数组还没有更新。
答案 0 :(得分:14)
如果你在这里解释你的意图是有用的,因为命名属性“数组”没有传达它的目的。我想从你的代码中你希望将每个项目的得分设置为零。请注意,您的保存当前正被忽略,因为您只能保存顶级mongoose文档,而不能保存嵌套文档。
对阵列的某些查找和修改操作可以使用$push
,例如$addToSet
,findOne
等单个数据库命令来完成。但是,我没有看到任何运算符这可以直接在一次操作中进行所需的更改。因此,我认为您需要找到您的记录,更改数组日期,并保存它。 (注意Record.findOne({ 'owner': owner}, {}, {sort: { date: -1 }}, function(err, record){
if (err) {
//don't just ignore this, log or bubble forward via callbacks
return;
}
if (!record) {
//Record not found, log or send 404 or whatever
return;
}
record.array.forEach(function (item) {
item.score = 0;
item.changed = true;
});
//Now, mongoose can't automatically detect that you've changed the contents of
//record.array, so tell it
//see http://mongoosejs.com/docs/api.html#document_Document-markModified
record.markModified('array');
record.save();
});
是一个便利功能,如果你只关心第一场比赛,你可以使用它,这似乎是你的情况。)
{{1}}
答案 1 :(得分:3)
如果您有文档的猫鼬对象,您当然可以使用以下警告更新问题中的数组。
这实际上是一个猫鼬问题。 Mongoose无法跟踪混合数组的变化,一个必须使用markModified:
doc.mixed.type = 'changed';
doc.markModified('mixed.type');
doc.save() // changes to mixed.type are now persisted