web-dev-qa-db-ja.com

MongoDBの.updateOneがNode.jsで機能しない

私は次のコードを持っています:

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と一致します。データベース内で「ObjectId( '5a42ja ...')」と呼ばれているときにプレーンテキストIDを照会していることが問題になる可能性があります

15
Simeon Nakov

次のように、更新クエリで「$ set」を使用する必要があります。

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

ドキュメント の詳細

[〜#〜] edit [〜#〜]

動作しない場合、これはおそらくフィルターと一致しないためです。

たぶん、次のようなObjectIdとの一致を試みる必要があります。

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

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

それが役に立てば幸い。

22
Sparw

つかいます {$set: {"name": req.body.name}}(Sparwが述べたように)ドキュメントで必要なプロパティを更新します。また、パラメーターとして渡すIDがコレクションに存在しない場合(同じIDを持つIDを作成する場合)、3番目のパラメーターとして渡すことができます{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);
      }) })
4
Dan Porat

タフな@Sprawの答えは場合によっては正しいが、時にはうまくいかないこともある。便利な答えはupdateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback)だと思います。

mongodb_idBSONオブジェクトであり、インスタンス化する必要があります。

1
MajidJafari