我需要更新一些字段 我正在使用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
interviewStatus
和roundStatus(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})
我不知道我哪里出错了
请帮忙。
答案 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}