使用mongoose更新mongodb记录中的数组

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)