MongoError.The positional operator did not find match needed from the query.在Function.create() 在Function.create()处,位置运算符没有从查询中找到所需的匹配。

问题描述 投票:0回答:1

我试图更新一个对象数组(用户)的值,如果它在MongoDB中不存在的话。这是我的Schema。

    ownerid:{
        type: Number,
        required: 'This field is required'
    },
    name:{
        type: String
    },
    capacity:{
        type: Number
    },
    basePrice:{
        type: Number 
    },
    users:[{
        id: Number,
        price: Number,
        target: Number,
        frequency: Number
    }],
    filePath:{
        type: String
    },
    status:{
        type: String
    }
}); 

下面是我的路由器方法。

app.post('/userBid',urlEncodedParser,function(req,res){
        resName=req.body.resName;
        console.log(resName);
        Resource.find({"name":resName},{"users.id": userid},function(err,existingUser){
            if (!existingUser){
                console.log("already in queue");
                //res.render('userHome.ejs');
            }
            else{
                console.log("in update");
            Resource.update({'name': resName},
      {'$set': {
             'users.$.frequency': 1,
             'users.$.id': userid,
             'users.$.price': req.body.price,
             'users.$.target': req.body.target
       }},{'multi': true},
          function(err,model) {
        if(err){
            console.log(err);
            return res.send(err);
        }
        return res.json(model);
 });

                }
        });


        });

我试过用$push,但似乎也不行。另外,我不能用'0'代替'$',因为多个用户会被用户插入,我需要把它们全部存储起来。

node.js mongodb mongoose
1个回答
0
投票

问题:

为什么我们要使用 $ 是为了更新一个数组字段中符合我们条件的特定对象few特定对象。所以当你使用任何位置运算符,如 $$[] 然后在过滤部分 .update({filterPart},{updatePart}) 查询,你需要使用过滤器来查找数组中的特定对象。例如,如果 id 领域是唯一的,在 users 然后你可以用它来过滤查找需要更新的对象。

试试下面这段代码。

app.post("/userBid", urlEncodedParser, function (req, res) {
  resName = req.body.resName;
  console.log(resName);
  /** Use findOne if `name` is unique.
   * Cause `existingUser` will be array, instead findOne will return an object or null - So you can just do if(existingUser)to check true values  */
  Resource.find({ name: resName }, { "users.id": userid }, function (
    err,
    existingUser
  ) {
    if (!existingUser) {
      console.log("already in queue");
      //res.render('userHome.ejs');
    } else {
      console.log("in update");
      Resource.update(
        { name: resName, "users.id": userid }, /** `"users.id": userid` is the only change needed */
        {
          $set: {
            "users.$.frequency": 1,
            "users.$.id": userid,
            "users.$.price": req.body.price,
            "users.$.target": req.body.target,
          },
        },
        { multi: true },
        function (err, model) {
          if (err) {
            console.log(err);
            return res.send(err);
          }
          return res.json(model);
        }
      );
    }
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.