Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 错误:Can';t规范化查询:BadValue不支持的投影选项_Node.js_Mongodb - Fatal编程技术网

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的值没有增加,如何同时更新数据库中的值?