【问题标题】:array update in mongoDBmongoDB中的数组更新
【发布时间】:2016-02-09 09:36:27
【问题描述】:

我有这样的猫鼬模式:

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
    }
 ]}

我正在尝试使用猫鼬保存功能来做到这一点:

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\') }',

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可能想尝试一种条件类型的更新操作,首先使用带有回调的 .update() 方法根据给定条件更新文档,然后在回调中执行其他更新对于不满足给定标准的文档。例如,您可以将其重组为:

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

    【讨论】:

    • 感谢您的回复。这对我不起作用,但经过 2 次更改后它起作用了。这一行: "photos._id": { "$ne": params.photoId } 我必须删除,所以我通过颠倒顺序来做到这一点 - 首先 - 将 mainFlag 设置为 false,然后在第二步设置为 true。另外 - 参数 multi: true - 对我不起作用,但没关系,因为我只有一张 mainPhoto。所以这些条件是:“photos.mainPhoto”:true - 更改为 false,以及:“photos._id”:params.photoId - 更改为 true,谢谢。
    • @JakubPałach 感谢您的反馈,我已更新我的答案以反映更改,让我知道更改是否正确并根据您的角度工作。
    猜你喜欢
    • 2015-08-27
    • 2018-03-14
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多