错误:无法规范化查询: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},您将获得更新前的文档。