2011-07-06 4 views
38

db.collection.find().limit(10)과 비슷한 모양을 구현하는 방법은 있지만 문서를 업데이트하는 중입니까?mongodb의 업데이트 문서 수를 제한하는 방법

이제는 db.collection.find().limit()으로 문서를 가져온 다음 그 내용을 업데이트하는 것과 같은 매우 진절머리 나는 것을 사용하고 있습니다.

일반적으로 주어진 레코드 수를 반환하고 각 레코드에서 하나의 필드를 변경하고 싶습니다.

감사합니다.

+5

를 사용하여 대량의 문서를 업데이트 할 수있다이 오픈 티켓 (2010, v1.6.0의) https://jira.mongodb.org/browse/SERVER-1599는하지만, 예정되지 않는다 조만간 출시 될 예정입니다. – zamnuts

답변

10

아쉽게도 해결 방법은 AFAIK를 수행하는 유일한 방법입니다. 부울 플래그 multi은 모든 일치를 업데이트하거나 (true 일 때) 또는 첫 번째 경기를 업데이트합니다 (false 일 때).

-6

업데이트에 제한을 적용하는 목적이 무엇인지 잘 모릅니다 (SQL에서도 가능하지 않음). 랍스타 worte : 업데이트는 하나의 문서 또는 업데이트 기준과 일치하는 모든 문서에서만 작동합니다. 따라서 이전 쿼리를 기반으로 필요에 따라 기준을 조정하거나 하나씩 업데이트해야합니다.

+2

은 내 데이터에 대한 두 가지 접근법을 모두 테스트했으며 find() all 및 update()는 find_and_modify()보다 훨씬 빠르게 작동합니다. 이걸하는 한 가지 방법 인 것처럼 보입니다. – awsum

+12

실제로 사실이 아닙니다. 물론 SQL의 업데이트에 제한을 추가 할 수 있습니다. 예 : "SET x = 1 WHERE x = 0 LIMIT 10"테이블을 업데이트하십시오. –

27

당신은 사용할 수 있습니다

db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
    function (e) { 
     e.fieldToChange = "blah"; 
     .... 
     db.collection.save(e); 
    } 
); 

(foreach는 코드에 대한 크레딧 : MongoDB: Updating documents using data from the same document)이 사용자가 지정한 항목의 수를 변경한다 무엇을 할 것 인

합니다. 당신은 "수집"내부 엔트리의 절반 값 1 "newField"라는 필드를 추가 할 경우 다음 또한 나머지 절반을 확인하려면 따라서 예를 들어, 당신은

db.collection.find().limit(db.collection.count()/2).forEach(
    function (e) { 
     e.newField = 1; 
     db.collection.save(e); 
    } 
); 

에 넣을 수 있습니다 "newField"가 있지만, 값 2, 당신은 newField가 존재하지 않는 조건으로 갱신 할 수 있습니다

db.collection.update({ newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true}); 
+0

Mongo 셸에서도 멋지다. –

1

을 대답은 업데이트 할 문서의 수를 제한 할 수있는 방법은 아직 없다 상태로를 (또는 삭제)를 값> 1로 설정하십시오.

db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})}) 
6

모든 개체를 반복하여 개별적으로 업데이트하는 솔루션은 매우 느립니다.

모두 검색 후 $in을 사용하여 동시에 업데이트하는 것이 더 효율적입니다. 쿼리가 Mongoid를 사용하여 작성하지만, 쉽게뿐만 아니라 몽고 셸에서 다시 작성할 수 있습니다

ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id) 
People.in(_id: ids).update_all(lastname: 'Cantero') 

.

3

forEach을 사용하면 각 문서를 개별적으로 업데이트하는 속도가 느립니다. 당신은 참고

ids = db.collection.find(<condition>).limit(<limit>).map(
    function(doc) { 
     return doc._id; 
    } 
); 
db.collection.updateMany({_id: {$in: ids}}, <update>}) 
관련 문제