MongoDB上的.updateOne无法在Node.js

时间:2017-12-05 14:54:37

标签: javascript node.js mongodb mongodb-query

我有以下代码:

connection((db) => {
            db.collection('orders')
                .updateOne(
                    { "_id": req.body._id}, // Filter
                    {"name": req.body.name} // Update
                )
                .then((obj) => {
                    console.log('Updated - ' + obj);
                    res.redirect('orders')
                })
                .catch((err) => {
                    console.log('Error: ' + err);
                })
        })

我想在订单中更改名称,但不会更新它。 控制台中的结果是

Updated - {"n":0,"nModified":0,"ok":1}

我试着阅读文档,但这很可怕

编辑:{$set: {"name": req.body.name}},效果不佳

编辑2:传递的ID与数据库中的_id匹配。我在数据库中查询纯文本ID是一个问题,它被称为“ObjectId('5a42ja ...')”

9 个答案:

答案 0 :(得分:14)

也许你应该使用" $ set"在您的更新查询中,如下所示:

{$set: {"name": req.body.name}}, // Update

documentation

中的更多信息

修改

如果它不起作用,可能是因为与您的过滤器不匹配。

也许你应该尝试匹配像这样的ObjectId:

var ObjectID = require('mongodb').ObjectID;

// In your request
{ "_id": ObjectID(req.body._id)}, // Filter

希望它有所帮助。

答案 1 :(得分:1)

使用{$set: {"name": req.body.name}}(如Sparw所提到的)更新文档中所需的属性。此外,如果您作为参数传递的id在集合中不存在(并且您想要创建具有相同ID的id),则可以传递第三个参数{upsert: true}来创建一个。

在你的例子中:

connection((db) => {
          db.collection('orders')
               .updateOne(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

答案 2 :(得分:0)

强硬@Spraw的回答在某些情况下是正确的,但有时不起作用。我认为方便的答案是($_.psendtime, get-date)[0]

updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback)中的_idmongodb对象,应实例化。

答案 3 :(得分:0)

为时已晚,但对于新手或使用mongodb学习Node.js的学生而言。而不是updateOne方法,只需使用update方法。

connection((db) => {
          db.collection('orders')
               .update(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

答案 4 :(得分:0)

对我来说,我必须先删除“ _id” / id字段,然后再在更新中传递对象。

否则会说该字段无效。

显然,在您将其用作参考时更新密钥并不是最好的选择。

答案 5 :(得分:0)

正确的语法是:

monDb.collection.updateOne(
    {"_id": ObjectID(req.params.id)}, 
    { $set: updateDoc }, 
    function(err, doc) {
      ...
    }
);

答案 6 :(得分:0)

我也遇到了麻烦,我用req.body中的_id创建了一个常量

const {_id} = req.body  //pass ID user
await User.updateOne({_id},{$set:data}, (err)=>{
            if(err) return res.status(200).json({
                error: true,
                code: 115,
                message: "Erro to update user!"
            })
        })

答案 7 :(得分:0)

如果收集模式缺少要更新的字段,则可能会发生这种情况。如果架构不严格(即isStrict:false),请检查更新运算符。在某些情况下,新的更新值可以与现有值相同。在这种情况下,猫鼬回来了

List<Tuple<NamePropeties, NameEntries>> joined = joinOn(
    properties,
    names,
    t -> Objects.equals(t.a.id, t.b.id) && Objects.equals(t.a.months, t.b.months)
);

答案 8 :(得分:0)

En NEXT.js

我的项目基于 React 和 Next.js。我有这个问题。 我愚蠢的解决方案是重新启动(下一个开发者)xD

我在我的 Schema 模型中添加了两个字段,并尝试更新这些新字段,但直到我重新启动 mi 项目后才起作用。

我希望为某人节省时间。 :)