MongoDB : 단일 명령으로 여러 문서를 업데이트하는 방법?


145

다음 예제 코드는 단일 문서 만 업데이트한다는 사실에 놀랐습니다.

> 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)에서만 사용할 수 있습니다. 쉘 true에서 네 번째 인수 update()로을 전달하여 다중 업데이트를 수행합니다 . 여기서 세 번째 인수는 upsert 인수입니다.

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

mongodb 2.2+ 버전의 경우 여러 문서를 한 번에 업데이트하려면 multi multi 옵션을 설정해야합니다.

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>) 여기서 옵션은 키 값 쌍 세트입니다. 설명서를 참조하십시오 : docs.mongodb.org/manual/applications/update
TechplexEngineer

3
다른 값을 다른 문서로 설정하려면 어떻게해야합니까? 이 작업을 수행하는 적절한 방법이 있습니까?
zach

oldvalue + "some string"에 대해 수행하는 방법
Mahesh K

34

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/


16

들어 몽고 버전> 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({ ... }) -단일 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 :
Prakash Pandey

4

MongoDB 클라이언트에서 다음을 입력하십시오.

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

버전 3.2의 새로운 기능

매개 변수 ::

{}:  select all records updated

키워드 인수가 사용 multi되지 않습니다


3

MongoDB는 업데이트 명령을 실행할 때 쿼리 기준과 일치하는 일치하는 문서를 하나만 찾습니다. 기준과 일치하는 더 많은 문서가 있더라도 먼저 일치하는 문서는 업데이트됩니다.

이를 극복하기 위해 update 문에 "MULTI"옵션을 지정할 수 있습니다. 이는 쿼리 기준과 일치하는 모든 도큐 넷을 업데이트한다는 의미입니다. 컬렉션에서 모든 documnet을 검색하여 기준과 일치하는 것을 찾습니다.

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.