programing

$toLower를 사용하여 MongoDB 컬렉션 업데이트

elecom 2023. 6. 2. 20:06
반응형

$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

반응형