[MONGODB] MongoDB가 : 동일한 문서 데이터를 이용하여 업데이트 문서 [중복]
MONGODBMongoDB가 : 동일한 문서 데이터를 이용하여 업데이트 문서 [중복]
나는 문서의 목록 (다른 사람의 사이에서) 위도 및 경도 특성을 가진 각이있다.
{ '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.은 $ 이름 바꾸기 연산자 (도입이 질문을 게시 한 후 한 달)는 값을 수정할 필요가 없습니다 사물의 이러한 종류의 작업을 수행하는 정말 쉽습니다을한다.
은 $ 이름 바꾸기 연산자 (도입이 질문을 게시 한 후 한 달)는 값을 수정할 필요가 없습니다 사물의 이러한 종류의 작업을 수행하는 정말 쉽습니다을한다.
몇 가지 테스트 문서에 삽입
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.업데이트 : 당신이해야 할 모든 값을 변경하지 않고 문서의 구조를 변경하는 경우, 멋진 솔루션을 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.우리는 실시간으로 데이터를 조작 할 몽고 스크립트를 사용할 수 있습니다. 그것은 나를 위해 작동합니다!
우리는 실시간으로 데이터를 조작 할 몽고 스크립트를 사용할 수 있습니다. 그것은 나를 위해 작동합니다!
내 주소 데이터를 수정하기 위해이 스크립트를 사용합니다.
현재 주소의 예 : "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.당신은 데이터의 복사본을 만드는 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.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.CLI에서? 난 당신이 먼저 값을 빼고 변수에 값을 할당해야합니다 생각합니다. 그런 다음 업데이트 명령을 실행합니다.
CLI에서? 난 당신이 먼저 값을 빼고 변수에 값을 할당해야합니다 생각합니다. 그런 다음 업데이트 명령을 실행합니다.
또는 문자열에서 제거 'DB'를 (나는 시도하지 않은). events.lat 및 events.lon 그것은 여전히 여러 값을 가질 것이다, 작동하는 경우, "위도"와 "경도"당신이 만든 새 배열에 대한 이전 값.
from https://stackoverflow.com/questions/3788256/mongodb-updating-documents-using-data-from-the-same-document by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 저장 현재까지 가장 좋은 방법 / MongoDB의 시간 (0) | 2019.12.01 |
---|---|
[MONGODB] 임의의 깊이에서 MongoDB를 필드 이름을 찾는 방법 (0) | 2019.12.01 |
[MONGODB] MongoDB를 원자 "findOrCreate"findOne, 삽입하면 존재하지 않는,하지만하지 않습니다 갱신 (0) | 2019.12.01 |
[MONGODB] MongoDB의 배열로부터 제거 개체 (0) | 2019.12.01 |
[MONGODB] 유성이 게시 이해 / 구독 (0) | 2019.12.01 |