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

时间:2013-07-25 17:41:46

标签: node.js mongodb mongoose

更新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
});

现在,我可以看到数组更新,保存时没有错误,但是当我再次查询数据库时,数组还没有更新。

2 个答案:

答案 0 :(得分:14)

如果你在这里解释你的意图是有用的,因为命名属性“数组”没有传达它的目的。我想从你的代码中你希望将每个项目的得分设置为零。请注意,您的保存当前正被忽略,因为您只能保存顶级mongoose文档,而不能保存嵌套文档。

对阵列的某些查找和修改操作可以使用$push,例如$addToSetfindOne等单个数据库命令来完成。但是,我没有看到任何运算符这可以直接在一次操作中进行所需的更改。因此,我认为您需要找到您的记录,更改数组日期,并保存它。 (注意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