alr*_*ken 3 mongoose mongodb node.js
更新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();
}
}
});
Run Code Online (Sandbox Code Playgroud)
架构看起来像这样:
var recordSchema = mongoose.Schema({
owner: {type: String},
date: {type: Date, default: Date.now},
array: mongoose.Schema.Types.Mixed
});
Run Code Online (Sandbox Code Playgroud)
现在,我可以看到数组更新,保存时没有错误,但是当我再次查询数据库时,数组尚未更新.
Pet*_*ons 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();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10374 次 |
| 最近记录: |