mongodb에서 업데이트 문서 수를 제한하는 방법
다음과 유사한 것을 구현하는 방법db.collection.find().limit(10)
문서를 업데이트하는 동안?
저는 이제 문서를 얻는 것과 같은 정말 형편없는 것을 사용하고 있습니다.db.collection.find().limit()
업데이트합니다.
일반적으로 주어진 레코드 수를 반환하고 각 레코드의 필드를 하나씩 변경합니다.
감사해요.
사용할 수 있는 항목:
db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
function (e) {
e.fieldToChange = "blah";
....
db.collection.save(e);
}
);
(각 코드에 대한 크레딧:MongoDB: 동일한 문서의 데이터를 사용하여 문서 업데이트)
이렇게 하면 지정한 항목 수만 변경됩니다.따라서 값이 1인 "newField"라는 필드를 "collection" 안에 있는 항목의 절반에만 추가하려면, 예를 들어,
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} );
사용.forEach
각 문서를 개별적으로 업데이트하는 속도가 느립니다.다음을 사용하여 문서를 대량으로 업데이트할 수 있습니다.
ids = db.collection.find(<condition>).limit(<limit>).map(
function(doc) {
return doc._id;
}
);
db.collection.updateMany({_id: {$in: ids}}, <update>})
모든 개체에 대해 반복한 다음 개별적으로 업데이트하는 솔루션은 매우 느립니다.
모든 파일을 검색한 후 다음을 사용하여 동시에 업데이트$in
더 효율적입니다.
ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')
쿼리는 Mongoid를 사용하여 작성되지만 Mongo Shell에서도 쉽게 다시 작성할 수 있습니다.
불행하게도 당신이 가지고 있는 해결책이 그것을 할 수 있는 유일한 방법입니다 AFAIK.부울 플래그가 있습니다.multi
그러면 모든 일치 항목이 업데이트됩니다(시)true
) 또는 첫 번째 일치 항목을 업데이트합니다.false
).
답변에 나와 있듯이 업데이트(또는 삭제)할 문서 수를 1보다 큰 값으로 제한할 방법이 없습니다. 다음과 같은 방법을 사용하는 해결 방법:
db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})})
ID가 ObjectId가 아닌 시퀀스 번호인 경우 for 루프에서 이 작업을 수행할 수 있습니다.
let batchSize= 10;
for (let i = 0; i <= 1000000; i += batchSize) {
db.collection.update({$and :[{"_id": {$lte: i+batchSize}}, {"_id": {$gt: i}}]}),{<your update>})
}
let fetchStandby = await db.model.distinct("key",{});
fetchStandby = fetchStandby.slice(0, no_of_docs_to_be_updated)
let fetch = await db.model.updateMany({
key: { $in: fetchStandby }
}, {
$set:{"qc.status": "pending"}
})
저도 최근에 이런 걸 원했어요.$in에서 업데이트하기 위해 _id의 긴 목록을 쿼리하는 것도 아마 느릴 것이라고 생각하기 때문에 aggregation+merge를 사용하려고 했습니다.
while (true) {
const record = db.records.findOne({ isArchived: false }, {_id: 1})
if (!record) {
print("No more records")
break
}
db.records.aggregate([
{ $match: { isArchived: false } },
{ $limit: 100 },
{
$project: {
_id: 1,
isArchived: {
$literal: true
},
updatedAt: {
$literal: new Date()
}
}
},
{
$merge: {
into: "records",
on: "_id",
whenMatched: "merge"
}
}
])
print("Done update")
}
하지만 $in으로 대량 업데이트하는 것보다 이것이 더 나은지 나쁜지 자유롭게 의견을 내십시오.
언급URL : https://stackoverflow.com/questions/6590890/how-to-limit-number-of-updating-documents-in-mongodb
'bestsource' 카테고리의 다른 글
Azure 호스팅된 WebApp의 IP 주소를 확인하는 방법 (0) | 2023.05.09 |
---|---|
디렉토리에서 최근 수정된 파일을 재귀적으로 찾는 방법은 무엇입니까? (0) | 2023.05.09 |
린트: "가 " 오류로 번역되지 않음을 무시하는 방법? (0) | 2023.05.09 |
bash 별칭 명령(단일 따옴표와 이중 따옴표 모두 포함) (0) | 2023.05.04 |
Xcode 6 iPhone Simulator 응용 프로그램 지원 위치 (0) | 2023.05.04 |