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

时间:2015-11-28 12:03:49

标签: 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=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 METHOD在事件架构中推送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文件,但无法找到这种类型的东西。我是节点js的新手。帮助我。

2 个答案:

答案 0 :(得分:2)

它应该是Event.update而不是Event.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"});
      }
    });
}

在事件变量中,您将获得在新状态下更新的文档。如果您已通过{new:false},您将获得更新前的文档。

答案 1 :(得分:0)

在我的情况下

我正在使用错误方法,如下所示,我正在通过以下方式更新记录 findOne,这是不可能的,这就是为什么问题 发生

解决方案:如果您想更新记录,请使用.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"
                                        })

                                    })