복붙노트

[MONGODB] MongoDB가 : 동일한 문서 데이터를 이용하여 업데이트 문서 [중복]

MONGODB

MongoDB가 : 동일한 문서 데이터를 이용하여 업데이트 문서 [중복]

나는 문서의 목록 (다른 사람의 사이에서) 위도 및 경도 특성을 가진 각이있다.

{ 'lat': 1, 'lon': 2, someotherdata [...] } 
{ 'lat': 4, 'lon': 1, someotherdata [...] }
[...]

나는 다음과 같이 보이도록 수정하려면 :

{ 'coords': {'lat': 1, 'lon': 2}, someotherdata [...]} 
{ 'coords': {'lat': 4, 'lon': 1}, someotherdata [...]}
[...]

지금까지 나는이있어 :

db.events.update({}, {$set : {'coords': {'lat': db.events.lat, 'lon': db.events.lon}}}, false, true)

그러나 문자열로 db.events.lat 및 db.events.lon을 처리합니다. 어떻게 문서의 속성을 참조 할 수 있습니까?

건배.

해결법

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

    1.은 $ 이름 바꾸기 연산자 (도입이 질문을 게시 한 후 한 달)는 값을 수정할 필요가 없습니다 사물의 이러한 종류의 작업을 수행하는 정말 쉽습니다을한다.

    은 $ 이름 바꾸기 연산자 (도입이 질문을 게시 한 후 한 달)는 값을 수정할 필요가 없습니다 사물의 이러한 종류의 작업을 수행하는 정말 쉽습니다을한다.

    몇 가지 테스트 문서에 삽입

    db.events.insert({ 'lat': 1, 'lon': 2, someotherdata: [] })
    db.events.insert({ 'lat': 4, 'lon': 1, someotherdata: [] })
    

    은 $ 이름 바꾸기 연산자를 사용하여

    db.events.update({}, {$rename: {'lat': 'coords.lat', 'lon': 'coords.lon'}}, false, true)
    

    결과

    db.events.find()
    {
        "_id" : ObjectId("5113c82dd28c4e8b79971add"),
        "coords" : {
            "lat" : 1,
            "lon" : 2
        },
        "someotherdata" : [ ]
    }
    {
        "_id" : ObjectId("5113c82ed28c4e8b79971ade"),
        "coords" : {
            "lat" : 4,
            "lon" : 1
        },
        "someotherdata" : [ ]
    }
    
  2. ==============================

    2.업데이트 : 당신이해야 할 모든 값을 변경하지 않고 문서의 구조를 변경하는 경우, 멋진 솔루션을 gipset의 답변을 참조하십시오.

    업데이트 : 당신이해야 할 모든 값을 변경하지 않고 문서의 구조를 변경하는 경우, 멋진 솔루션을 gipset의 답변을 참조하십시오.

    업데이트 문서 페이지에서 (지금은 사용할 수 없음) 의견에 따르면, 당신이 업데이트에서 현재 문서의 속성을 참조 할 수 없습니다 ().

    당신은 모든 문서를 반복이이처럼 그들을 업데이트 할 수 있습니다 :

    db.events.find().snapshot().forEach(
      function (e) {
        // update document, using its own properties
        e.coords = { lat: e.lat, lon: e.lon };
    
        // remove old properties
        delete e.lat;
        delete e.lon;
    
        // save the updated document
        db.events.save(e);
      }
    )
    

    이러한 기능은 또한 당신의 필요에 따라지도-감소 작업이나 서버 측 db.eval () 작업에 사용할 수 있습니다.

  3. ==============================

    3.우리는 실시간으로 데이터를 조작 할 몽고 스크립트를 사용할 수 있습니다. 그것은 나를 위해 작동합니다!

    우리는 실시간으로 데이터를 조작 할 몽고 스크립트를 사용할 수 있습니다. 그것은 나를 위해 작동합니다!

    내 주소 데이터를 수정하기 위해이 스크립트를 사용합니다.

    현재 주소의 예 : "12 번 5 번가,".

    나는 마지막 중복 쉼표, 예상되는 새 주소 ","12 번 5 번가 "를 제거합니다.

    var cursor = db.myCollection.find().limit(100);
    
    while (cursor.hasNext()) {
      var currentDocument = cursor.next();
    
      var address = currentDocument['address'];
      var lastPosition = address.length - 1;
    
      var lastChar = address.charAt(lastPosition);
    
      if (lastChar == ",") {
    
        var newAddress = address.slice(0, lastPosition);
    
    
        currentDocument['address'] = newAddress;
    
        db.localbizs.update({_id: currentDocument._id}, currentDocument);
    
      }
    }
    

    희망이 도움이!

  4. ==============================

    4.당신은 데이터의 복사본을 만드는 OK있는만큼, 집계 프레임 워크는 여기에 대한 대안으로 사용할 수 있습니다. 당신은 또한 당신이 다른 연산자를 사용하고자하는 경우 데이터에 더 많은 작업을 수행 할 수있는 옵션을 가지고 있지만, 당신이 필요로하는 단 하나 $ 프로젝트입니다. 그것은 공간의 측면에서 다소 낭비하지만 신속하고 적절한 일부 사용하실 수 있습니다. 설명하기 위해, 내가 먼저 푸 수집에 일부 샘플 데이터를 삽입합니다 :

    당신은 데이터의 복사본을 만드는 OK있는만큼, 집계 프레임 워크는 여기에 대한 대안으로 사용할 수 있습니다. 당신은 또한 당신이 다른 연산자를 사용하고자하는 경우 데이터에 더 많은 작업을 수행 할 수있는 옵션을 가지고 있지만, 당신이 필요로하는 단 하나 $ 프로젝트입니다. 그것은 공간의 측면에서 다소 낭비하지만 신속하고 적절한 일부 사용하실 수 있습니다. 설명하기 위해, 내가 먼저 푸 수집에 일부 샘플 데이터를 삽입합니다 :

    db.foo.insert({ 'lat': 1, 'lon': 2, someotherdata : [1, 2, 3] })
    db.foo.insert({ 'lat': 4, 'lon': 1, someotherdata : [4, 5, 6] })
    

    이제, 우리는 다음 위도 및 경도 필드를 재 newfoo의 컬렉션에 보내 $ 프로젝트를 사용 :

    db.foo.aggregate([
        {$project : {_id : "$_id", "coords.lat" : "$lat", "coords.lon" : "$lon", "someotherdata" : "$someotherdata" }},
        { $out : "newfoo" }
    ])
    

    그리고 우리의 변경된 데이터를 newfoo을 확인 :

    db.newfoo.find()
    { "_id" : ObjectId("544548a71b5cf91c4893eb9a"), "someotherdata" : [ 1, 2, 3 ], "coords" : { "lat" : 1, "lon" : 2 } }
    { "_id" : ObjectId("544548a81b5cf91c4893eb9b"), "someotherdata" : [ 4, 5, 6 ], "coords" : { "lat" : 4, "lon" : 1 } }
    

    새 데이터에 만족하면, 당신은 그 이전의 이름으로 새로운 데이터를 이전 데이터를 삭제하고 사용하는 renameCollection () 명령을 사용할 수 있습니다 :

    > db.newfoo.renameCollection("foo", true)
    { "ok" : 1 }
    > db.foo.find()
    { "_id" : ObjectId("544548a71b5cf91c4893eb9a"), "someotherdata" : [ 1, 2, 3 ], "coords" : { "lat" : 1, "lon" : 2 } }
    { "_id" : ObjectId("544548a81b5cf91c4893eb9b"), "someotherdata" : [ 4, 5, 6 ], "coords" : { "lat" : 4, "lon" : 1 } }
    

    마지막으로 참고 - SERVER-7944은이 대답에 제안하고 활동이 다른 곳으로 이동하는 데 발생하는 경우 한 번 이상 문서를 때리는 끝낼 수 있도록 _id 인덱스를 암시하여 스냅 샷에 해당 할 수 없습니다 완료 될 때까지. 이 예에서 _id 필드를 삽입하고 있기 때문에, 당신은 속는와 끝까지하지 않도록 이러한 발생, 고유 키 위반이 발생할 것입니다,하지만 당신은 문서의 "이전"버전이있을 수 있습니다. 항상 그렇듯이, 그것을 삭제하기 전에 철저하게 데이터를 확인하고, 바람직하게는 백업을 수행.

  5. ==============================

    5.Neils 대답. 그냥 사람들이 당신이 경우 당신은 큰 데이터베이스에서이 프로그램을 실행할 수 없습니다 알려 것은 원격 Robomongo 같은 쉘하고 말을 할 수 있습니다. 당신은 실제 서버의 몽고 쉘에 ssh를해야합니다. 오히려 업데이트 할 것입니다 경우에도 당신은 또한이 작업을 수행 할 수 있습니다.

    Neils 대답. 그냥 사람들이 당신이 경우 당신은 큰 데이터베이스에서이 프로그램을 실행할 수 없습니다 알려 것은 원격 Robomongo 같은 쉘하고 말을 할 수 있습니다. 당신은 실제 서버의 몽고 쉘에 ssh를해야합니다. 오히려 업데이트 할 것입니다 경우에도 당신은 또한이 작업을 수행 할 수 있습니다.

    db.Collection.find({***/ possible query /***}).toArray().forEach(
      function(obj){
        obj.item = obj.copiedItem;
        obj.otherItem = obj.copiedItem;
        obj.thirdItem = true;
        obj.fourthItem = "string";
        db.Collection.update({_id: obj._id}, obj);
      }
    );
    
  6. ==============================

    6.CLI에서? 난 당신이 먼저 값을 빼고 변수에 값을 할당해야합니다 생각합니다. 그런 다음 업데이트 명령을 실행합니다.

    CLI에서? 난 당신이 먼저 값을 빼고 변수에 값을 할당해야합니다 생각합니다. 그런 다음 업데이트 명령을 실행합니다.

    또는 문자열에서 제거 'DB'를 (나는 시도하지 않은). events.lat 및 events.lon 그것은 여전히 ​​여러 값을 가질 것이다, 작동하는 경우, "위도"와 "경도"당신이 만든 새 배열에 대한 이전 값.

  7. from https://stackoverflow.com/questions/3788256/mongodb-updating-documents-using-data-from-the-same-document by cc-by-sa and MIT license