Node.js 错误:Can';t规范化查询:BadValue不支持的投影选项
用户模式Node.js 错误:Can';t规范化查询:BadValue不支持的投影选项,node.js,mongodb,Node.js,Mongodb,用户模式 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=
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方法在事件模式中推送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
}
post方法不正确吗?我看过其他mongodb文档,但找不到这种类型的东西。我是NodeJS的新手。帮助我。它应该是
事件。更新
而不是事件。findById
,而且您的推送操作看起来也错误。应该是这样的:
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"});
}
});
}
在events变量中,您将获得在新状态下更新的文档。如果您通过了{new:false},您将获得更新之前的文档
就我而言
我使用的方法错误如下,我是通过
芬顿,这不可能,就我而言,这就是问题的原因
发生
解决方案:如果要更新记录,请使用.update()方法,
如果要查找记录,可以使用.find(),.findOne(),不要不匹配
domain.Cart.findOne({
UserId: req.body.UserId,
shopId: req.body.shopId,
},
{ $addToSet: { "productDetails": _productDetails } }
).exec(function (err, results) {
console.log(err, results)
callback(null, {
result: results,
msg: "productCount has been updated"
})
})
那么,我该如何计算评级呢?它显示错误。TypeError:无法读取未定义的属性“count”。我回家后将更新答案。您正在寻找findOneAndUpdate方法,而不是updateUpdate更新答案。请检查事件是否作为数组或文档本身返回。是。它以数组形式返回事件。谢谢但是为什么它不早点回来呢?当它返回文件和没有返回文件时,我感到困惑。我还有一个疑问。数据库中count的值没有增加,如何同时更新数据库中的值?