错误:无法规范化查询:BadValue不支持的投影选项

用户架构

var UserSchema = new Schema({ name: String, username: { type: String, required: true, index: { unique: true }}, password: { type: String, required: true, select: false}, favouriteid:[{eventid:String}] }); 

事件模式

 var EventSchema=new Schema({ name:String, location:{ type:String }, description:{type:String }, price: String, rating: { value: String, count: {type: String, default: 10}, userrating: [{ uservalue: String, userid: String }] }, imageurl:[String], userimageurl:[String], reviews:[{ userid:String, username: String, comment:String}] }); 

POST方法在Event Schema中推送userid和uservalue的值。

 api.post('/rateevent', function (req, res) { var userid = req.body.userid; var uservalue = req.body.uservalue; var eventid = req.body.eventid; Event.findById({_id: eventid}, {$push: {rating: {userrating: {uservalue: uservalue, userid: userid}}}}, {upsert: true}, function (err, events) { if (err) { res.send(err); return; } else { calculaterating(events); } }); function calculaterating(event) { event.rating.count++; event.rating.value = (event.rating.value * (event.rating.count - 1) + uservalue) / event.rating.count; res.json("rating updated"); } }); 

它显示以下错误:

 { "name": "MongoError", "message": "Can't canonicalize query: BadValue Unsupported projection option: $push: { rating: { userrating: { uservalue: \"5\", userid: \"56593f3657e27af8245735d7\" } } }", "$err": "Can't canonicalize query: BadValue Unsupported projection option: $push: { rating: { userrating: { uservalue: \"5\", userid: \"56593f3657e27af8245735d7\" } } }", "code": 17287 } 

发布方法不正确? 我看过其他的mongodb文件,但是找不到这种types的东西。 我是节点js的新手。 帮我。

它应该是Event.update而不是Event.findById ,而且你的push操作看起来是错误的。 应该是这样的:

 Event.findOneAndUpdate( {_id: eventid}, {$push: {'rating.userrating': {uservalue: uservalue, userid: userid}}}, {new: true}, function (err, events) { if (err) { res.send(err); return; } else { if(events.length > 0){ calculaterating(events); } else { res.json({msg: "Nothing to update"}); } } }); function calculaterating(event) { event = event[0]; //get the object from array event.rating.count++; event.rating.value = (event.rating.value * (event.rating.count - 1) + uservalue) / event.rating.count; Event.update( {_id: eventid}, {$set: { 'rating.count': event.rating.count, 'rating.value': event.rating.value }}, function(err, response){ if (err) { res.send(err); return; } else { res.json({msg: "rating updated"}); } }); } 

在事件variables中,您将获得以新状态更新的文档。 如果您通过了{new:false},您将获得更新前的文档。