Node.js mongoDB中的数组更新

Node.js mongoDB中的数组更新,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有这样的猫鼬模式: var mySchema = new mongoose.Schema({ user: String, photos: [{ url: String, thumbnail: String, time: Date, mainPhoto: Boolean }] }); { "_id": { "$oid": "56269dea07a455920a21bca7" }, "user": "some

我有这样的猫鼬模式:

var mySchema = new mongoose.Schema({
    user: String,
    photos: [{
       url: String,
       thumbnail: String,
       time: Date,
       mainPhoto: Boolean
    }]
});
{
"_id": {
    "$oid": "56269dea07a455920a21bca7"
},
"user": "someUser",
"photos": [
    {
        "time": {
            "$date": "2015-05-25T08:37:56.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e2e07a455920a21bcab"
        },
        "mainPhoto": false
    },
    {
        "time": {
            "$date": "2015-05-25T09:27:17.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e3507a455920a21bcae"
        },
        "mainPhoto": true
    },
    {
        "time": {
            "$date": "2015-05-25T09:27:17.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e3507a455920a21bcaf"
        },
        "mainPhoto": false
    }
 ]}
现在,我想做一个“setMainPhoto”函数——对于给定的id——将mainPhoto标志设置为true,对于其他照片将其设置为false。 有这样一份文件:

var mySchema = new mongoose.Schema({
    user: String,
    photos: [{
       url: String,
       thumbnail: String,
       time: Date,
       mainPhoto: Boolean
    }]
});
{
"_id": {
    "$oid": "56269dea07a455920a21bca7"
},
"user": "someUser",
"photos": [
    {
        "time": {
            "$date": "2015-05-25T08:37:56.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e2e07a455920a21bcab"
        },
        "mainPhoto": false
    },
    {
        "time": {
            "$date": "2015-05-25T09:27:17.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e3507a455920a21bcae"
        },
        "mainPhoto": true
    },
    {
        "time": {
            "$date": "2015-05-25T09:27:17.000Z"
        },
        "thumbnail": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "url": "https://s3-eu-west-1.amazonaws.com/...jpg",
        "_id": {
            "$oid": "56269e3507a455920a21bcaf"
        },
        "mainPhoto": false
    }
 ]}
我正在尝试使用mongoose保存功能执行此操作:

var myModel = mongoose.model('myCollection', mySchema);
myModel.find({user:params.user,_id:params.documentId}, function(err,data){
    var newMyModel = new myModel(data[0]);

    for(var i=0; i<newMyModel.photos.length; i++){
        if(newMyModel.photos[i]._id == params.photoId){
            newMyModel.photos[i].mainPhoto = true;
        }else{
            newMyModel.photos[i].mainPhoto = false;
        }
    }

    return newTrack.save(function(err,results){
      console.log(err,results);
      return cb(err,results);
    });
  });

除此之外,我觉得有一种更好的方法可以做到这一点

您可能希望尝试一种条件类型的更新操作,该操作首先使用带有回调的方法根据给定条件更新文档,然后在回调中对不满足给定条件的文档进行另一次更新。例如,您可以将其重组为:

var Model = mongoose.model('myCollection', mySchema);
Model.update(
    {
        "_id": params.documentId,
        "user": params.user,
        "photos.mainPhoto": true            
    }, 
    {
        "$set": {
            "photos.$.mainPhoto": false
        }
    },        
    function(err, numAffected) {        
        Model.update(
            {
                "_id": params.documentId,
                "user": params.user,
                "photos._id": params.photoId /* criteria for setting the updating the documents to true */
            }, 
            {
                "$set": {
                    "photos.$.mainPhoto": true
                }
            },
            function(err, numAffected) {
                /* Update complete. */
            }
        )
    }
)

谢谢你的回复。这对我来说不起作用,但经过两次改变后就起作用了。这一行:“photos._id”:{“$ne”:params.photoId}我必须删除,所以我通过颠倒顺序完成了它-首先-将mainFlag设置为false,然后在第二步中设置为true。另外,参数multi:true对我不起作用,但这没关系,因为我只有一张主照片。因此,这些条件是:“photos.mainPhoto”:true-更改为false,以及:“photos.u id”:params.photoId-更改为true谢谢。@jakubbał感谢您的反馈,我已经更新了我的答案以反映这些更改,让我知道这些更改是否正确,并根据您的角度进行操作。