177

次のサンプルコードは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

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

4

13 に答える 13

300

マルチ アップデートが最近追加されたため、開発リリース (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!"}})
于 2009-11-16T05:30:38.527 に答える
35

v3.3 から updateMany を使用できます

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

v2.2 では、更新関数は次の形式を取ります。

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

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

于 2013-12-16T05:07:30.620 に答える
7

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

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

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

興味のある方は、 Mongo-Hackerをチェックしてください。

于 2013-01-08T14:10:18.250 に答える
5

MongoDB クライアントで、次のように入力します。

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

バージョン 3.2 の新機能

パラメータ::

{}:  select all records updated

キーワード引数 multiが取られません

于 2016-06-20T23:52:14.493 に答える
3

次のコマンドは、コレクションの複数のレコードを更新できます

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)
于 2020-01-14T11:44:01.583 に答える
2

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

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
于 2017-12-25T13:55:02.393 に答える
1

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

次のように、フラグ multi を true に設定するだけです。

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

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

于 2015-04-27T14:31:14.307 に答える
-1

これを共有してくれてありがとう、私は2.6.7で使用し、次のクエリはうまくいきました.

すべてのドキュメント:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

単一のドキュメントの場合:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
于 2015-02-07T15:59:50.047 に答える