MongoDB: 하나의 명령어로 여러 문서를 업데이트하려면 어떻게 해야 합니까?
다음 예제 코드가 하나의 문서만 업데이트한다는 것을 알고 놀랐습니다.
> 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
모든 것이 변경될 때까지 루프를 통해 업데이트를 계속할 수 있다는 것은 알지만, 이는 매우 비효율적인 것 같습니다.더 좋은 방법이 있을까요?
최근에 다중 업데이트가 추가되었으므로 개발 릴리스(1.1.3)에서만 사용할 수 있습니다.셸에서 여러 업데이트를 수행합니다.true
네 번째 논거로서update()
여기서 세 번째 인수는 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!"}})
v3.3부터는 update Many를 사용할 수 있습니다.
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/
Mongo version > 2.2의 경우 필드 multi를 추가하여 true로 설정합니다.
db.Collection.update({query},
{$set: {field1: "f1", field2: "f2"}},
{multi: true })
더 나은 인터페이스로 이 작업을 수행할 수 있는 방법을 개발했습니다.
db.collection.find({ ... }).update({ ... })
-- 멀티 업데이트db.collection.find({ ... }).replace({ ... })
-- 단일 교환db.collection.find({ ... }).upsert({ ... })
-- 단일 상승db.collection.find({ ... }).remove()
--멀티 삭제
업데이트를 미리 체인으로 연결하여 제한, 건너뛰기, 정렬 및 제거할 수도 있습니다.
관심있다면 Mongo-Hacker를 확인해보세요.
전체 컬렉션을 업데이트하려면
db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })
MongoDB 클라이언트에서 다음을 입력합니다.
db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})
버전 3.2의 신기능
파라미터:
{}: select all records updated
키워드 인수multi
찍히지 않다
갱신 명령어를 발행할 때 MongoDB는 조회 기준에 일치하는 문서를 1개만 찾습니다.조건에 일치하는 문서가 더 있어도 처음에 일치하는 문서는 갱신됩니다.
이를 극복하기 위해 업데이트 스테이트먼트에 "MULTI" 옵션을 지정할 수 있습니다.즉, 쿼리 기준에 일치하는 모든 문서를 업데이트해야 합니다.수집 중 조건에 일치하는 모든 문서를 검색하여 업데이트하십시오.
db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
다음 명령어는 컬렉션의 여러 레코드를 업데이트할 수 있습니다.
db.collection.update({},
{$set:{"field" : "value"}},
{ multi: true, upsert: false}
)
update Many() 메서드의 형식은 다음과 같습니다.
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
레스토랑 컬렉션에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "name" : "Central Perk Cafe", "violations" : 3 }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "violations" : 2 }
{ "_id" : 3, "name" : "Empire State Sub", "violations" : 5 }
{ "_id" : 4, "name" : "Pizza Rat's Pizzaria", "violations" : 8 }
다음 작업은 위반이 4보다 큰 모든 문서를 업데이트하고 $set 검토를 위한 플래그를 설정합니다.
try {
db.restaurant.updateMany(
{ violations: { $gt: 4 } },
{ $set: { "Review" : true } }
);
} catch (e) {
print(e);
}
모든 최신 버전의 mongodb update Many()는 정상적으로 동작하고 있습니다.
db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
나도 같은 문제가 있었고, 나는 해결책을 찾았고, 그것은 마법처럼 작용했다.
다음과 같이 플래그를 true로 설정합니다.
db.Collection.update(
{_id_receiver: id_receiver},
{$set: {is_showed: true}},
{multi: true} /* --> multiple update */
, function (err, updated) {...});
도움이 되었으면 좋겠다:)
쓸 수 있어요.`
Model.update({
'type': "newuser"
}, {
$set: {
email: "abc@gmail.com",
phoneNumber:"0123456789"
}
}, {
multi: true
},
function(err, result) {
console.log(result);
console.log(err);
}) `
공유해 주셔서 감사합니다.저는 2.6.7로 사용했고, 다음 쿼리는 방금 작동했습니다.
모든 문서의 경우:
db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})
단일 문서의 경우:
db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
언급URL : https://stackoverflow.com/questions/1740023/mongodb-how-to-update-multiple-documents-with-a-single-command
'programing' 카테고리의 다른 글
Oracle 쿼리: 최근 10분 동안 삽입된 테이블에서 데이터를 가져옵니다. (0) | 2023.04.01 |
---|---|
'string' 유형은 'inherit' | 'initial' | 'unset' | 'fixed' | 'absolute' | 'static' | 'relative' | 'sticky'에 할당할 수 없습니다. (0) | 2023.04.01 |
ng-app과 data-ng-app의 차이점은 무엇입니까? (0) | 2023.04.01 |
확산 인수는 태플 형식을 갖거나 rest 매개 변수로 전달되어야 합니다. React (0) | 2023.03.27 |
WooCommerce가 카트에서 프로그래밍 방식으로 삭제 (0) | 2023.03.27 |