db.collection.find().limit(10)
과 비슷한 모양을 구현하는 방법은 있지만 문서를 업데이트하는 중입니까?mongodb의 업데이트 문서 수를 제한하는 방법
이제는 db.collection.find().limit()
으로 문서를 가져온 다음 그 내용을 업데이트하는 것과 같은 매우 진절머리 나는 것을 사용하고 있습니다.
일반적으로 주어진 레코드 수를 반환하고 각 레코드에서 하나의 필드를 변경하고 싶습니다.
감사합니다.
db.collection.find().limit(10)
과 비슷한 모양을 구현하는 방법은 있지만 문서를 업데이트하는 중입니까?mongodb의 업데이트 문서 수를 제한하는 방법
이제는 db.collection.find().limit()
으로 문서를 가져온 다음 그 내용을 업데이트하는 것과 같은 매우 진절머리 나는 것을 사용하고 있습니다.
일반적으로 주어진 레코드 수를 반환하고 각 레코드에서 하나의 필드를 변경하고 싶습니다.
감사합니다.
아쉽게도 해결 방법은 AFAIK를 수행하는 유일한 방법입니다. 부울 플래그 multi
은 모든 일치를 업데이트하거나 (true
일 때) 또는 첫 번째 경기를 업데이트합니다 (false
일 때).
업데이트에 제한을 적용하는 목적이 무엇인지 잘 모릅니다 (SQL에서도 가능하지 않음). 랍스타 worte : 업데이트는 하나의 문서 또는 업데이트 기준과 일치하는 모든 문서에서만 작동합니다. 따라서 이전 쿼리를 기반으로 필요에 따라 기준을 조정하거나 하나씩 업데이트해야합니다.
은 내 데이터에 대한 두 가지 접근법을 모두 테스트했으며 find() all 및 update()는 find_and_modify()보다 훨씬 빠르게 작동합니다. 이걸하는 한 가지 방법 인 것처럼 보입니다. – awsum
실제로 사실이 아닙니다. 물론 SQL의 업데이트에 제한을 추가 할 수 있습니다. 예 : "SET x = 1 WHERE x = 0 LIMIT 10"테이블을 업데이트하십시오. –
당신은 사용할 수 있습니다
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});
Mongo 셸에서도 멋지다. –
을 대답은 업데이트 할 문서의 수를 제한 할 수있는 방법은 아직 없다 상태로를 (또는 삭제)를 값> 1로 설정하십시오.
db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})})
모든 개체를 반복하여 개별적으로 업데이트하는 솔루션은 매우 느립니다.
모두 검색 후 $in
을 사용하여 동시에 업데이트하는 것이 더 효율적입니다. 쿼리가 Mongoid를 사용하여 작성하지만, 쉽게뿐만 아니라 몽고 셸에서 다시 작성할 수 있습니다
ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')
.
forEach
을 사용하면 각 문서를 개별적으로 업데이트하는 속도가 느립니다. 당신은 참고
ids = db.collection.find(<condition>).limit(<limit>).map(
function(doc) {
return doc._id;
}
);
db.collection.updateMany({_id: {$in: ids}}, <update>})
를 사용하여 대량의 문서를 업데이트 할 수있다이 오픈 티켓 (2010, v1.6.0의) https://jira.mongodb.org/browse/SERVER-1599는하지만, 예정되지 않는다 조만간 출시 될 예정입니다. – zamnuts