>

각각 위도 및 경도 속성이있는 문서 목록이 있습니다.

{ '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.latdb.events.lon을 문자열로 취급합니다. 문서의 속성을 어떻게 참조 할 수 있습니까?

건배.


  • 답변 # 1

    $rename 연산자 (이 질문이 게시 된 후 한 달에 소개됨)를 사용하면 값을 수정할 필요가없는 이런 종류의 작업을 쉽게 수행 할 수 있습니다.

    일부 테스트 문서 삽입

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

    와이즈 비즈 사용  연산자

    $rename
    
    

    결과

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

  • 답변 # 2

    업데이트 :값을 변경하지 않고 문서의 구조를 변경하기 만하면 유용한 솔루션에 대한 깃셋의 답변을 참조하십시오.

    <시간>

    문서 업데이트 페이지의 (현재 사용할 수없는) 주석에 따르면 db.events.find() { "_id" : ObjectId("5113c82dd28c4e8b79971add"), "coords" : { "lat" : 1, "lon" : 2 }, "someotherdata" : [ ] } { "_id" : ObjectId("5113c82ed28c4e8b79971ade"), "coords" : { "lat" : 4, "lon" : 1 }, "someotherdata" : [ ] } 내에서 현재 문서의 속성을 참조 할 수 없습니다. .

    모든 문서를 반복하고 다음과 같이 업데이트해야합니다 :

    update()
    
    

    이러한 함수는 맵 축소 작업 또는 서버 측 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); } ) 에서도 사용할 수 있습니다.  필요에 따라 작업 할 수 있습니다.

  • 답변 # 3

    Mongo 스크립트를 사용하여 데이터를 즉시 조작 할 수 있습니다. 그것은 나를 위해 작동합니다!

    이 스크립트를 사용하여 주소 데이터를 수정합니다.

    현재 주소의 예 : "No.12, FIFTH AVENUE".

    최근의 중복 쉼표, 예상되는 새 주소 ""No.12, FIFTH AVENUE "를 제거하고 싶습니다.

    db.eval()
    
    

    이것이 도움이되기를 바랍니다!

  • 답변 # 4

    데이터 사본을 생성해도 괜찮다면 여기서 집계 프레임 워크를 대안으로 사용할 수 있습니다. 다른 연산자를 사용하려는 경우 데이터에 더 많은 작업을 수행 할 수있는 옵션도 있지만 필요한 유일한 것은 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); } } 입니다 . 공간면에서는 다소 낭비 적이지만 일부 용도에는 더 빠르고 적합 할 수 있습니다. 설명하기 위해 먼저 샘플 데이터를 $project 에 삽입하겠습니다.  수집 :

    foo
    
    

    이제 db.foo.insert({ 'lat': 1, 'lon': 2, someotherdata : [1, 2, 3] }) db.foo.insert({ 'lat': 4, 'lon': 1, someotherdata : [4, 5, 6] }) 를 사용합니다.   $project 를 재 작업  그리고 lat  필드를 lon 에 보내십시오  수집 :

    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()
    
    

    마지막 메모-SERVER-7944가 완료 될 때까지 > 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 } } 를 암시하여 스냅 샷과 동등한 작업을 수행 할 수 없습니다.  이 답변에 제안 된대로 색인을 작성하면 다른 곳에서 활동으로 인해 문서가 이동하는 경우 문서를 두 번 이상 칠 수 있습니다. _id 를 삽입하고 있기 때문에  이 예에서 필드는 이러한 키가 발생하면 고유 한 키 위반이 발생하므로 속임수로 끝나지 않지만 "오래된"버전의 문서가있을 수 있습니다. 항상 그렇듯이 데이터를 삭제하기 전에 철저하게 확인하고 백업하는 것이 좋습니다.

  • 답변 # 5

    닐이 대답합니다. Robomongo와 같은 원격 셸을 사용한다고 말하면 사람들에게 큰 데이터베이스에서 실행할 수 없다는 것을 사람들에게 알릴 수 있습니다. 실제 서버의 mongo 쉘에 ssh해야합니다. 업데이트를 수행하려는 경우에도이 작업을 수행 할 수 있습니다.

    _id
    
    
    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); } );

관련 자료

  • 이전 Angular 2 - 각도 2 - 이상한 출력 오류
  • 다음 JSF/Java EE를 사용하여 데이터베이스에서 실시간 업데이트