【问题标题】:Error:Can't canonicalize query: BadValue Unsupported projection option错误:无法规范化查询:BadValue 不支持的投影选项
【发布时间】:2020-03-17 18:44:02
【问题描述】:

用户架构

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
}

post 方法不正确?我看过其他 mongodb 文档,但找不到这种类型的东西。我是节点 js 的新手。帮帮我。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    它应该是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"});
          }
        });
    }
    

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

    【讨论】:

    • 那么,我应该如何计算评分?它显示错误。TypeError:无法读取未定义的属性“计数”
    • 我回家后会更新答案。您正在寻找 findOneAndUpdate 方法而不是 update
    • 更新答案。请检查事件是作为数组还是作为文档本身返回。
    • 是的。它将事件作为数组返回。谢谢。但是为什么不早点回来呢?当它返回 doc 和不返回时,我感到很困惑。
    • 我还有一个疑问。数据库中count的值没有增加,如何同时更新数据库中的值?
    【解决方案2】:

    在我的情况下

    我使用了 wrong 方法,如下所示,我正在通过以下方式更新记录 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"
                                            })
    
                                        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-11
      • 2015-11-08
      • 2014-07-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多