数组更新在mongoDB

我有这样的mongoose模式:

var mySchema = new mongoose.Schema({ user: String, photos: [{ url: String, thumbnail: String, time: Date, mainPhoto: Boolean }] }); 

现在,我想制作一个“setMainPhoto”函数 – 对于给定的id – 将mainPhoto标志设置为true,并将其设置为false为其他照片。 有这样一个文件:

 { "_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保存function做到这一点:

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

但我得到一个错误:

  'E11000 duplicate key error index: xx.$_id_ dup key: { : ObjectId(\'56269dea07a455920a21bca7\') }', 

除了我觉得有一个更好的方法来做到这一点

您可能想要尝试使用.update()方法根据给定标准更新文档的条件types的更新操作,然后在callback中对不符合给定条件的文档执行另一个更新。 例如,您可以将其重构为:

 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. */ } ) } )