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 |