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] })
이제 우리는 그냥$project
lat
★★★★★★★★★★★★★★★★★」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
'programing' 카테고리의 다른 글
리액트의 차이점은 무엇입니까?Function Component와 플레인 JS 함수 컴포넌트 (0) | 2023.03.01 |
---|---|
TypeScript에서 캐치 및 마지막으로 스테이트먼트를 시도하는 방법은 무엇입니까? (0) | 2023.03.01 |
Json으로 NaN 전송 (0) | 2023.03.01 |
jQuery.ajax를 사용한HTTP DELETE를 지원하지 않는 브라우저는 무엇입니까? (0) | 2023.03.01 |
ACF를 사용하여 분류 용어에서 이미지 가져오기 (0) | 2023.03.01 |