$toLower를 사용하여 MongoDB 컬렉션 업데이트
사용자 이름이 포함된 기존 MongoDB 컬렉션이 있습니다.사용자 이름에는 소문자와 대문자가 모두 포함됩니다.
모든 사용자 이름에 소문자만 포함되도록 업데이트합니다.
이 스크립트를 시도해 보았지만 작동하지 않았습니다.
db.myCollection.find().forEach(
function(e) {
e.UserName = $toLower(e.UserName);
db.myCollection.save(e);
}
)
MongoDB에는 다음과 같은 개념이 없습니다.$toLower명령으로서솔루션은 대규모로 운영하는 것입니다.for데이터를 루프하고 업데이트를 개별적으로 실행합니다.
모든 드라이버 또는 셸에서 이 작업을 수행할 수 있습니다.
db.myCollection.find().forEach(
function(e) {
e.UserName = e.UserName.toLowerCase();
db.myCollection.save(e);
}
)
저장을 원자성 업데이트로 바꿀 수도 있습니다.
db.myCollection.update({_id: e._id}, {$set: {UserName: e.UserName.toLowerCase() } })
다시 말씀드리지만, 어떤 드라이버에서도 이 작업을 수행할 수 있습니다. 코드는 매우 유사합니다.
편집: 레몬은 좋은 점을 지적합니다.그$toLower명령은 집계 프레임워크의 일부로 존재하지만 업데이트와는 관련이 없습니다.업데이트를 위한 설명서는 여기에 있습니다.
시작하는Mongo 4.2집계db.collection.update() 파이프라인을 수락하여 최종적으로 자체 값을 기반으로 필드를 업데이트할 수 있습니다.
// { username: "Hello World" }
db.collection.updateMany(
{},
[{ $set: { username: { $toLower: "$username" } } }]
)
// { username: "hello world" }
첫 번째 파트
{}업데이트할 문서(이 경우 모든 문서)를 필터링하는 일치 쿼리입니다.제2부
[{ $set: { username: { $toLower: "$username" } } }],업데이트 집계 파이프라인입니다(집계 파이프라인 사용을 나타내는 대괄호 참조).$set이 경우 의 값을 수정하는 새로운 집계 연산자입니다."username".- 를 사용하여 다음 값을 수정합니다.
"username"소문자 버전으로
매우 유사한 솔루션이지만 이것은 새로운 mongo 3.2 Mongo Shell 또는 MongoChef와 같은 동등한 DB 도구에서 다음을 실행하는 데 도움이 되었습니다!
db.tag.find({hashtag :{ $exists:true}}).forEach(
function(e) {
e.hashtag = e.hashtag.toLowerCase();
db.tag.save(e);
});
수용된 솔루션으로 저는 만약을 위해 요소 배열에 대해 동일한 작업을 수행하는 것이 매우 사소한 것임을 알고 있습니다.
db.myCollection.find().forEach(
function(e) {
for(var i = 0; i < e.articles.length; i++) {
e.articles[i] = e.articles[i].toLowerCase();
}
db.myCollection.save(e);
}
)
파티에 조금 늦었지만 아래 답변은 mongo 3.4 이상에서 매우 잘 작동합니다. 먼저 사례가 다른 레코드만 가져오고 해당 레코드만 대량으로 업데이트합니다.이 쿼리의 성능이 여러 배 향상되었습니다.
var bulk = db.myCollection.initializeUnorderedBulkOp();
var count = 0
db.myCollection.find({userId:{$regex:'.*[A-Z]'}}).forEach(function(e) {
var newId = e.userId.toLowerCase();
bulk.find({_id:e._id}).updateOne({$set:{userId: newId}})
count++
if (count % 500 === 0) {
bulk.execute();
bulk = db.myCollection.initializeUnorderedBulkOp();
count = 0;
}
})
if (count > 0) bulk.execute();
컬렉션의 모든 항목에 대해 필드가 존재하는지 확인하기 위한 참고 사항입니다.그렇지 않은 경우 다음과 같은 if 문이 필요합니다.
if (e.UserName) e.UserName = e.UserName.toLowerCase();
언급URL : https://stackoverflow.com/questions/9423932/update-mongodb-collection-using-tolower
'programing' 카테고리의 다른 글
| Xcode 프로젝트에서 "빌드 설정" 목록을 인쇄하려면 어떻게 해야 합니까? (0) | 2023.06.02 |
|---|---|
| 메서드의 실행 시간 계산 (0) | 2023.06.02 |
| Angular2 바디 태그에 클래스 추가 (0) | 2023.06.02 |
| 빈 어레이 확장을 'set -u'로 바시 (0) | 2023.06.02 |
| jQuery 선택기:아이드는? (0) | 2023.05.28 |