Updating array within mongodb record with mongoose

mongodb, mongoose, node.js

Solution

It would help if you explained your intent here as naming a property "array" conveys nothing about its purpose. I guess from your code you hope to go and set the score of each item there to zero. Note your save is currently being ignored because you can only save top-level mongoose documents, not nested documents.

Certain find-and-modify operations on arrays can be done with a single database command using the Array Update Operators like `$push`, `$addToSet`, etc. However I don't see any operators that can directly make your desired change in a single operation. Thus I think you need to find your record, alter the array date, and save it. (Note `findOne` is a convenience function you can use if you only care about the first match, which seems to be the case for you).

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();        
 });

Problem

What is the best way to update a value within an array saved in a mongodb record? Currently, I'm trying it this way: ``` 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(); } } }); ``` And the schema looks like this: ``` var recordSchema = mongoose.Schema({ owner: {type: String}, date: {type: Date, default: Date.now}, array: mongoose.Schema.Types.Mixed }); ``` Right now, I can see that the array updates, I get no error in saving, but when I query the database again, the array hasn't been updated.

Original source