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


144

次のコード例では、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

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

回答:


247

マルチ更新は最近追加されたため、開発リリース(1.1.3)でのみ利用可能です。シェルから、true4番目の引数としてに渡すことによってマルチ更新を行います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!"}})

3
この変更がいつ発生したかはわかりませんが、Mongodb v2.2.2では少し異なります。db.collection.update(<query>、<update>、<options>)ここで、optionsはキーと値のペアのセットです。ドキュメントを参照:docs.mongodb.org/manual/applications/update
TechplexEngineer

3
異なるドキュメントに異なる値を設定したい場合はどうなりますか?これを行うためのエレガントな方法はありますか?
zach 2013

oldvalue + "some string"に対してそれを行う方法
Mahesh K


16

以下のためにMongoのバージョン> 2.2、フィールドのマルチを追加し、trueに設定

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

7

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

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

また、制限を適用したり、スキップしたり、更新に事前にチェーンすることで更新や削除を行ったりすることもできます。

興味があれば、Mongo-Hackerをチェックしてください。


1
TypeError:db.getCollection(...)。find(...)。updateは関数ではありません:?
Anthony

うまくdb.userActivity.find({ 'appId' : 1234, 'status' : 1}).update({ $set: { 'status': 1 } }); 2017-06-05T17:47:10.038+0530 E QUERY [thread1] TypeError: db.userActivity.find(...).update is not a function :
いき

4

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

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

バージョン3.2の新機能

パラメータ::

{}:  select all records updated

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


3

MongoDBは、更新コマンドの発行時に、クエリ基準に一致する一致するドキュメントを1つだけ見つけます。基準に一致するドキュメントがさらにある場合でも、最初に一致するドキュメントが偶然に更新されます。

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

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

2

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

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)

1

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

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

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

それが役に立てば幸いです:)


1

コレクション全体を更新するには、

db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })

0

使えます。`

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

0

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

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

-1

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

すべてのドキュメント:

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

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

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.