복붙노트

[MONGODB] 어떻게 필드의 유형을 변경하려면?

MONGODB

어떻게 필드의 유형을 변경하려면?

나는 몽고 쉘 내에서 필드의 유형을 변경하려합니다.

나는이 일을하고 ...

db.meta.update(
  {'fields.properties.default': { $type : 1 }}, 
  {'fields.properties.default': { $type : 2 }}
)

그러나 그것은 작동하지 않습니다!

해결법

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

    1.데이터의 $ 유형을 변경하는 유일한 방법은 데이터가 올바른 유형이 데이터에 대한 업데이트를 수행하는 것입니다.

    데이터의 $ 유형을 변경하는 유일한 방법은 데이터가 올바른 유형이 데이터에 대한 업데이트를 수행하는 것입니다.

    당신이 (더블) 1 ~ 2 (문자열)에서 $ 유형을 변경하려는 것처럼이 경우, 그것은 보인다.

    그래서 간단하게 다시 문서를 저장 한 다음 캐스트 (새 문자열 (X)) 등을 수행 DB에서 문서를로드합니다.

    당신은 쉘에서 프로그램과 완전히이 작업을 수행해야하는 경우 찾기 (...)를 사용할 수 있습니다. 대해 forEach (기능 (X) {}) 구문을.

    아래의 두 번째 의견에 대응. 수집에 foo 문자열로 숫자에서 필드 불량을 변경합니다.

    db.foo.find( { 'bad' : { $type : 1 } } ).forEach( function (x) {   
      x.bad = new String(x.bad); // convert field to string
      db.foo.save(x);
    });
    
  2. ==============================

    2.정수에 문자열 필드를 변환 :

    정수에 문자열 필드를 변환 :

    db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) { 
        obj.field-name = new NumberInt(obj.field-name);
        db.db-name.save(obj);
    });
    

    문자열에 정수 필드로 변환 :

    db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) {
        obj.field-name = "" + obj.field-name;
        db.db-name.save(obj);
    });
    
  3. ==============================

    3.INT 변환 문자열.

    INT 변환 문자열.

    db.my_collection.find().forEach( function(obj) {
        obj.my_value= new NumberInt(obj.my_value);
        db.my_collection.save(obj);
    });
    

    이중 변환 문자열.

        obj.my_value= parseInt(obj.my_value, 10);
    

    플로트의 경우 :

        obj.my_value= parseFloat(obj.my_value);
    
  4. ==============================

    4.

    db.coll.find().forEach(function(data) {
        db.coll.update({_id:data._id},{$set:{myfield:parseInt(data.myfield)}});
    })
    
  5. ==============================

    5.모든 대답은 지금까지 모든 컬렉션 요소 클라이언트 측 반복의 Foreach의 일부 버전을 사용하십시오.

    모든 대답은 지금까지 모든 컬렉션 요소 클라이언트 측 반복의 Foreach의 일부 버전을 사용하십시오.

    그러나 집계 파이프 라인 및 $ 등의 단계에서를 사용하여 MongoDB를의 서버 측 처리를 사용할 수 있습니다 :

    예:

    db.documents.aggregate([
             {
                $project: {
                   _id: 1,
                   numberField: { $substr: ['$numberField', 0, -1] },
                   otherField: 1,
                   differentField: 1,
                   anotherfield: 1,
                   needolistAllFieldsHere: 1
                },
             },
             {
                $out: 'documents',
             },
          ]);
    
  6. ==============================

    6.배열은 당신의 번호로 ""추가 생성하지 않고 몽고에서 문자열로 INT32 변환하려면 :-)

    배열은 당신의 번호로 ""추가 생성하지 않고 몽고에서 문자열로 INT32 변환하려면 :-)

    db.foo.find( { 'mynum' : { $type : 16 } } ).forEach( function (x) {   
      x.mynum = x.mynum + ""; // convert int32 to string
      db.foo.save(x);
    });
    
  7. ==============================

    7.날짜 필드에 문자열 유형의 필드를 변환하려면, 당신은 $를 사용하여 업데이트 한 후 Date 객체에 필드를 변환하고 반복 필드 루프 내에서 foreach는 () 메소드를 사용하여 찾기 () 메소드에 의해 반환 커서를, 필요 집합 연산자.

    날짜 필드에 문자열 유형의 필드를 변환하려면, 당신은 $를 사용하여 업데이트 한 후 Date 객체에 필드를 변환하고 반복 필드 루프 내에서 foreach는 () 메소드를 사용하여 찾기 () 메소드에 의해 반환 커서를, 필요 집합 연산자.

    당신은 당신이 모든에 단 한 번, 서버에 대한 모든 요청을 전송하지 않는 한 당신에게 더 나은 성능을 제공합니다 말 1000 일괄 서버로 작업을 보내는 것으로 더 나은 성능을 제공 대량 업데이트를 대량 API를 사용하여 활용 1000 개 요청.

    다음은 첫 번째 예 MongoDB의 버전> = 2.6 <3.2 사용할 벌크 API를 사용하여 이러한 접근법을 보여준다. 그것은 모든 업데이트 날짜 필드에 모든 created_at 필드를 변경하여 컬렉션의 문서 :

    var bulk = db.collection.initializeUnorderedBulkOp(),
        counter = 0;
    
    db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
        var newDate = new Date(doc.created_at);
        bulk.find({ "_id": doc._id }).updateOne({ 
            "$set": { "created_at": newDate}
        });
    
        counter++;
        if (counter % 1000 == 0) {
            bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
            bulk = db.collection.initializeUnorderedBulkOp();
        }
    })
    // Clean up remaining operations in queue
    if (counter % 1000 != 0) { bulk.execute(); }
    

    다음 예제는 이후 bulkWrite ()를 사용하는 API의 새로운 세트를 대량 API를 사용되지 않으며 제공 한 새로운 MongoDB를 버전 3.2에 적용

    var bulkOps = [];
    
    db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) { 
        var newDate = new Date(doc.created_at);
        bulkOps.push(         
            { 
                "updateOne": { 
                    "filter": { "_id": doc._id } ,              
                    "update": { "$set": { "created_at": newDate } } 
                }         
            }           
        );     
    })
    
    db.collection.bulkWrite(bulkOps, { "ordered": true });
    
  8. ==============================

    8.정말로 MongoDB의에서 개체의 유형을 변경하는 나에게 도움이 것은 아마도 ... 전 여기에 언급 단지이 간단한 라인했다 :

    정말로 MongoDB의에서 개체의 유형을 변경하는 나에게 도움이 것은 아마도 ... 전 여기에 언급 단지이 간단한 라인했다 :

    db.Users.find({age: {$exists: true}}).forEach(function(obj) {
        obj.age = new NumberInt(obj.age);
        db.Users.save(obj);
    });
    

    사용자는 내 컬렉션이며, 나이는 대신 정수 (INT32)의 문자열을했다 객체입니다.

  9. ==============================

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

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

    // { a: "45", b: "x" }
    // { a:  53,  b: "y" }
    db.collection.update(
      { a : { $type: 1 } },
      [{ $set: { a: { $toString: "$a" } } }],
      { multi: true }
    )
    // { a: "45", b: "x" }
    // { a: "53", b: "y" }
    

    경우 캐스트가 아닌 이중에서 문자열로, 당신은 $ toBool, $ toInt 같은 몽고 4.0에 도입 된 다른 변환 사업자 사이의 선택의 여지가 ...

    귀하의 타겟 유형에 대한 전용 컨버터가없는 경우, 당신은 {$ toString을 "$ A"} 대체 할 수있는 $의 변환 동작 : {$ 변환 : {입력 : "$ A"로 : 2}} 경우 에 대한 값은이 테이블에서 찾을 수 있습니다 :

    db.collection.update(
      { a : { $type: 1 } },
      [{ $set: { a: { $convert: { input: "$a", to: 2 } } } }],
      { multi: true }
    )
    
  10. ==============================

    10.나는이 문서의 수집에 여러 데이터 유형을 변경하려면 다음을 사용 그래서 나는, 컬렉션에 여러 필드의 데이터 유형을 변경해야합니다. 오래된 질문에 대한 답변 그러나 다른 사람을 위해 도움이 될 수 있습니다.

    나는이 문서의 수집에 여러 데이터 유형을 변경하려면 다음을 사용 그래서 나는, 컬렉션에 여러 필드의 데이터 유형을 변경해야합니다. 오래된 질문에 대한 답변 그러나 다른 사람을 위해 도움이 될 수 있습니다.

    db.mycoll.find().forEach(function(obj) { 
    
        if (obj.hasOwnProperty('phone')) {
            obj.phone = "" + obj.phone;  // int or longint to string
        }
    
        if (obj.hasOwnProperty('field-name')) {
         obj.field-name = new NumberInt(obj.field-name); //string to integer
        }
    
        if (obj.hasOwnProperty('cdate')) {
            obj.cdate = new ISODate(obj.cdate); //string to Date
        }
    
        db.mycoll.save(obj); 
    });
    
  11. ==============================

    11.나는 부동 소수점 변환에 문자열을 MongoDB의 콘솔에서이 스크립트를 사용 ...

    나는 부동 소수점 변환에 문자열을 MongoDB의 콘솔에서이 스크립트를 사용 ...

    db.documents.find({ 'fwtweaeeba' : {$exists : true}}).forEach( function(obj) { 
            obj.fwtweaeeba = parseFloat( obj.fwtweaeeba ); 
            db.documents.save(obj); } );    
    
    db.documents.find({ 'versions.0.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { 
            obj.versions[0].content.fwtweaeeba = parseFloat( obj.versions[0].content.fwtweaeeba ); 
            db.documents.save(obj); } );
    
    db.documents.find({ 'versions.1.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { 
            obj.versions[1].content.fwtweaeeba = parseFloat( obj.versions[1].content.fwtweaeeba );  
            db.documents.save(obj); } );
    
    db.documents.find({ 'versions.2.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) { 
            obj.versions[2].content.fwtweaeeba = parseFloat( obj.versions[2].content.fwtweaeeba );  
            db.documents.save(obj); } );
    

    PHP에서 그리고이 일)))

    foreach($db->documents->find(array("type" => "chair")) as $document){
        $db->documents->update(
            array('_id' => $document[_id]),
            array(
                '$set' => array(
                    'versions.0.content.axdducvoxb' => (float)$document['versions'][0]['content']['axdducvoxb'],
                    'versions.1.content.axdducvoxb' => (float)$document['versions'][1]['content']['axdducvoxb'],
                    'versions.2.content.axdducvoxb' => (float)$document['versions'][2]['content']['axdducvoxb'],
                    'axdducvoxb' => (float)$document['axdducvoxb']
                )
            ),
            array('$multi' => true)
        );
    
    
    }
    
  12. ==============================

    12.

    You can easily convert the string data type to numerical data type.
    Don't forget to change collectionName & FieldName.
    for ex : CollectionNmae : Users & FieldName : Contactno.
    

    이 쿼리 ..

    db.collectionName.find().forEach( function (x) {
    x.FieldName = parseInt(x.FieldName);
    db.collectionName.save(x);
    });
    
  13. ==============================

    13.몽고 OBJECTID 사용 몽구스에 문자열에서 필드 중간의 데모 변경 유형

    몽고 OBJECTID 사용 몽구스에 문자열에서 필드 중간의 데모 변경 유형

     Post.find({}, {mid: 1,_id:1}).exec(function (err, doc) {
                 doc.map((item, key) => {
                    Post.findByIdAndUpdate({_id:item._id},{$set:{mid: mongoose.Types.ObjectId(item.mid)}}).exec((err,res)=>{
                        if(err) throw err;
                        reply(res);
                    });
                });
            });
    

    몽고 ObjectId가이 같은 스타일의 또 다른 예입니다

    숫자, 문자열, 다른 응답 의지 도움말 사람을 희망 부울.

  14. ==============================

    14.내 경우, 나는 다음을 사용

    내 경우, 나는 다음을 사용

    function updateToSting(){
      var collection = "<COLLECTION-NAME>";
      db.collection(collection).find().forEach(function(obj) {
        db.collection(collection).updateOne({YOUR_CONDITIONAL_FIELD:obj.YOUR_CONDITIONAL_FIELD},{$set:{YOUR_FIELD:""+obj.YOUR_FIELD}});
      });
    }
    
  15. from https://stackoverflow.com/questions/4973095/how-to-change-the-type-of-a-field by cc-by-sa and MIT license