복붙노트

[MONGODB] $ tolower를를 사용하여 업데이트 MongoDB를 수집

MONGODB

$ tolower를를 사용하여 업데이트 MongoDB를 수집

나는 사용자 이름을 포함하는 기존 MongoDB를 수집합니다. 사용자 이름은 소문자와 대문자를 모두 포함되어 있습니다.

나는 그들이 단지 소문자를 포함하여 모든 사용자 이름을 업데이트 할.

나는이 스크립트를 시도했다, 그러나 그것은 작동하지 않았다

db.myCollection.find().forEach(
 function(e) {
 e.UserName = $toLower(e.UserName);
 db.myCollection.save(e);
 }
)

해결법

  1. ==============================

    1.MongoDB를이 명령으로 $ tolower를의 개념이 없습니다. 이 솔루션은 데이터에 루프 큰를 실행하고 개별적으로 업데이트를 실행하는 것입니다.

    MongoDB를이 명령으로 $ tolower를의 개념이 없습니다. 이 솔루션은 데이터에 루프 큰를 실행하고 개별적으로 업데이트를 실행하는 것입니다.

    당신은 어떤 드라이버 또는 셸에서이 작업을 수행 할 수 있습니다

    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를 명령은 통합 프레임 워크의 한 부분으로 존재를 않습니다, 그러나 이것은 갱신과는 아무 상관이 없습니다. 업데이트에 대한 문서는 여기에있다.

  2. ==============================

    2.몽고 4.2 시작, db.collection.update ()는 마지막으로 자신의 값에 따라 필드의 업데이트를 허용 집계 파이프 라인을 받아 들일 수 있습니다 :

    몽고 4.2 시작, db.collection.update ()는 마지막으로 자신의 값에 따라 필드의 업데이트를 허용 집계 파이프 라인을 받아 들일 수 있습니다 :

    // { username: "Hello World" }
    db.collection.update(
      {},
      [{ $set: { username: { $toLower: "$username" } } }],
      { multi: true }
    )
    // { username: "hello world" }
    
  3. ==============================

    3.이하지만 매우 유사한 솔루션은 새로운 몽고 3.2에서 저를했습니다 몽고 쉘 또는 MongoChef 같은 동등한 DB 도구에서 다음을 실행합니다!

    이하지만 매우 유사한 솔루션은 새로운 몽고 3.2에서 저를했습니다 몽고 쉘 또는 MongoChef 같은 동등한 DB 도구에서 다음을 실행합니다!

    db.tag.find({hashtag :{ $exists:true}}).forEach(
     function(e) {
       e.hashtag = e.hashtag.toLowerCase();
       db.tag.save(e);
    });
    
  4. ==============================

    4.다만 경우에 내가 요소의 배열에 대해 동일한 작업을 수행하기 위해 아주 사소한 알고있는 허용 솔루션으로

    다만 경우에 내가 요소의 배열에 대해 동일한 작업을 수행하기 위해 아주 사소한 알고있는 허용 솔루션으로

    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); 
       }
    )
    
  5. ==============================

    5.메이크업에 그냥 참고 확인 필드 컬렉션의 모든 항목이 존재합니다. if 문 그렇지 않으면 당신은 다음과 같은가 필요합니다 :

    메이크업에 그냥 참고 확인 필드 컬렉션의 모든 항목이 존재합니다. if 문 그렇지 않으면 당신은 다음과 같은가 필요합니다 :

    if (e.UserName) e.UserName = e.UserName.toLowerCase();
    
  6. ==============================

    6.늦은 파티에 작은하지만 대답 아래는 몽고 3.4 이상 아주 잘 작동 먼저 다른 경우 대량의 레코드 만 업데이트가 만 기록을 얻을. 이 쿼리의 성능은 가지각색 낫다

    늦은 파티에 작은하지만 대답 아래는 몽고 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();
    
  7. from https://stackoverflow.com/questions/9423932/update-mongodb-collection-using-tolower by cc-by-sa and MIT license