无法更新mongodb中的数据

时间:2016-08-10 05:29:09

标签: node.js mongodb express mongoose mongodb-query

我需要更新一些字段 我正在使用mongoose驱动程序并表达js

模式:

 var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ProfilesSchema = new Schema({

    presentRound: {
        type: Number,
        default: 1
    },

    scheduleInterviewStatus: {
        type: Boolean,
        default: false
    },

    interviewStatus: String,

    ratings: [{
        round: Number,
        rating: Number,
        feedback: String,
        interviewer: String,
        roundStatus: String
    }]
});

module.exports = mongoose.model('Profiles',ProfilesSchema);

所以我需要按照presentRound scheduleInterviewStatus interviewStatusroundStatus(in ratings array by matching round number)

进行更新

更新前:

    presentRound: 1,
    scheduleInterviewStatus: true,
    interviewStatus: "on-hold",
    ratings: [{
        round: 1,
        rating: 3,
        feedback: "good communication skills",
        interviewer: "Vishal",
        roundStatus: "second opinion"
    }]

更新后:

    presentRound: 2,
    scheduleInterviewStatus: false,
    interviewStatus: "in-process",
    ratings: [{
        round: 1,
        rating: 3,
        feedback: "good communicationskills",
        interviewer: "Vishal",
        roundStatus: "selected"
    }]

我试图先在robomongo中运行查询,但收到错误

Error: Fourth argument must be empty when specifying upsert and multi with an object.

查询:

   db.getCollection('profiles').update({
        "_id": ObjectId("57a9aa24e93864e02d91283c")
    }, {
        $set: {
            "presentRound": 2,
            "interviewStatus":"in process",
            "scheduleInterviewStatus": false          

        }
    },{
        "ratings.$.round": 1
    },{
        $set: {

            "ratings.roundStatus":"selected"


        }
    },
   { upsert: true },{multi:true})

我不知道我哪里出错了

请帮忙。

2 个答案:

答案 0 :(得分:4)

您的 update 声明不正确,错误参数 - 您将多个 $set 操作和选项作为更新的不同参数方法;它们应该在单独的指定更新参数下。正确的Node.js syntax是:

update(selector, document, options, callback)

其中selector是一个对象,它是更新操作的选择器/查询,document也是一个对象,它是更新文档,最后是options对象,默认情况下是null并具有可选的更新设置。

你在这里做

update(selector, document, selector, document, options, options, callback)

mongo使用前两个参数更新集合是正确的,它自然会抛出错误

  

错误:指定upsert和multi时,第四个参数必须为空   用一个物体。

因为您指定了太多不正确的参数。

此外,您对位置运算符的使用不正确。它应该是要更新的文档的一部分,而不是查询。

要获得正确的实施,请按照此更新

进行操作
db.getCollection('profiles').update(
    /* selector  */
    {
        "_id": ObjectId("57a9aa24e93864e02d91283c"),
        "ratings.round": 1
    }, 
    /* update document */
    {
        "$set": {
            "presentRound": 2,
            "interviewStatus": "in process",
            "scheduleInterviewStatus": false,
            "ratings.$.roundStatus": "selected"    
        }
    },
    /* optional settings */
    { upsert: true, multi: true }
)

答案 1 :(得分:0)

替换{upsert:true} - > {upsert:true,strict:false}