programing

MongoDB: 동일한 문서의 데이터를 사용하여 문서 업데이트

css3 2023. 3. 1. 11:23

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은 문자열로 취급됩니다.문서의 속성을 참조하려면 어떻게 해야 합니까?

건배.

업데이트: 값을 변경하지 않고 문서 구조를 변경하기만 하면 되는 경우 gipset의 답변을 참조하십시오.


문서 업데이트 페이지의 (지금은 사용할 수 없음) 설명에 따르면 현재 문서의 속성을 다음 문서 내에서 참조할 수 없습니다.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);
  }
)

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

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

결과.

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

Neils가 대답합니다.Robomongo와 같은 원격 셸을 실행하는 경우 대규모 데이터베이스에서는 실행할 수 없습니다.실제 서버의 mongo 쉘에 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);
  }
);

Mongo 스크립트를 사용하여 데이터를 즉시 조작할 수 있습니다.나에게는 그게 효과가 있어요!

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

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

마지막 중복 쉼표, 예상되는 새 주소 "No.12, FIHVE AVENE"를 삭제합니다.

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] })

이제 우리는 그냥$projectlat ★★★★★★★★★★★★★★★★★」lon,, 그, , 그, 그, ,, ,, ,, ,, ,, ,, ,, , the.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 } }

새 데이터에 만족하면 다음 명령을 사용하여 이전 데이터를 삭제하고 이전 이름으로 새 데이터를 사용할 수 있습니다.

> 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이 예에서 이러한 경우 고유한 키 위반이 발생하므로 듀프가 발생하지 않지만 문서의 "이전" 버전이 있을 수 있습니다.항상 그렇듯이 데이터를 삭제하기 전에 철저히 확인하고 가급적 백업을 하십시오.

CLI에서요?먼저 값을 추출하고 변수에 값을 할당해야 한다고 생각합니다.그런 다음 update 명령을 실행합니다.

또는 (아직 시도하지 않았습니다) 문자열에서 'db'를 제거합니다. events.lat ★★★★★★★★★★★★★★★★★」events.lon동작해도 "lat"과 "lon"의 이전 값 및 새로 작성한 어레이 등 여러 개의 값이 유지됩니다.

언급URL : https://stackoverflow.com/questions/3788256/mongodb-updating-documents-using-data-from-the-same-document