web-dev-qa-db-ja.com

MongoDB:単一のコマンドで複数のドキュメントを更新する方法

次のコード例では1つのドキュメントのみが更新されることに驚いた。

> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});

> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});

> db.test.find({"test":"success!"}).count();
1

すべてを変更するまでループして更新を続けることができますが、それは非常に効率が悪いようです。もっと良い方法はありますか?

117
Luke Dennis

マルチアップデートは最近追加されたため、開発リリース(1.1.3)でのみ利用可能です。シェルから、trueを4番目の引数としてupdate()に渡すことでマルチ更新を行います。3番目の引数はupsert引数です。

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);

mongodb 2.2+のバージョンでは、一度に複数のドキュメントを更新するには、オプションmultiをtrueに設定する必要があります。

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

mongodb 3.2以降のバージョンでは、新しいメソッドupdateMany()を使用して、個別のmultiオプションを必要とせずに、複数のドキュメントを一度に更新することもできます。

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
203
mdirolf

UPDATE V2.2以降、更新機能は次の形式を取ります:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

選択した回答は適用されなくなりました。

https://docs.mongodb.com/manual/reference/method/db.collection.update/

31
user602525

Mongoバージョン> 2.2の場合、フィールドmultiを追加してtrueに設定します

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })
13
Kartik Singh

より良いインターフェースでこれを行う方法を作成しました。

  • db.collection.find({ ... }).update({ ... })-マルチ更新
  • db.collection.find({ ... }).replace({ ... })-単一の置換
  • db.collection.find({ ... }).upsert({ ... })-単一のアップサート
  • db.collection.find({ ... }).remove()-マルチ削除

制限を適用、スキップ、更新を並べ替え、事前に連鎖させることで削除することもできます。

興味のある方は、 Mongo-Hacker をご覧ください

7
Tyler Brock

MongoDBクライアントで、次を入力します。

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

バージョン3.2の新機能

パラメータ::

{}:  select all records updated

キーワード引数multiは使用されません

4
Boseam

MongoDBは、更新コマンドを発行しているときにクエリ条件に一致する一致するドキュメントを1つだけ検出します。条件に一致するドキュメントがさらに無視されても、最初に一致するドキュメントが更新されます。

これを克服するために、更新ステートメントで「MULTI」オプションを指定できます。つまり、クエリ条件に一致するすべてのドキュメントを更新します。コレクション内のすべてのドキュメントをスキャンして、基準に一致するドキュメントを見つけて更新します。

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
3

私は同じ問題を抱えていました、そして私は解決策を見つけました、そしてそれは魅力のように機能します

このようにフラグmultiをtrueに設定するだけです:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

私はそれが役立つことを願っています:)

1
Amine_Dev

使用できます。

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `
0
Jitendra

Mongodb 3.2以降のバージョンでは、updateMany()メソッドを使用して複数のドキュメントを更新できます。

http://answerexpress.blogspot.com/2018/09/mongodb-how-to-update-multiple.html

0
Sunil Jose

Mongodbのすべての最新バージョンpdateMany()は正常に動作しています

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
0
KARTHIKEYAN.A