각각 위도 및 경도 속성이있는 문서 목록이 있습니다.
{ '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
- 답변 # 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); } );
관련 자료
- node.js - 쿼리 필터와 정확히 일치하지 않고 MongoDb 컬렉션의 문서 업데이트
- express - MERN 스택, Mongodb는 특정 값이있는 경우이 값으로 모든 임베디드 문서 배열을 업데이트합니다
- node.js - 중첩 배열 mongodb 업데이트
- c# - 컬렉션의 Mongodb에서 특정 유형의 문서 자동 삭제
- javascript - 클라우드 기능을 사용하여 Firestore에서 문서를 삭제하는 방법
- docusignapi - docusign을 사용하여 자체 사이트에서 문서 서명
- 문서 A3 형식 및 가로 방향 인 경우 C #을 사용하여 Word 파일 페이지를 PNG 이미지로 변환하는 방법은 무엇입니까?
- go - mongodb에서 일부 문서를 볼 수 없습니다
- aggregate - MongoDb $lookup 배열 필드의 중첩 문서
- laravel - Jenssegers를 사용하여 한 MongoDB 컬렉션에서 다른 컬렉션으로 데이터를 복사하는 방법
- database - mongodb 쿼리 - 주어진 범위에서 배열의 모든 요소를 가진 문서 찾기
- sql - case 문으로 술어 삽입, 삭제, 업데이트 사용
- mongodb - 평균이 숫자보다 큰 쿼리 문서
- flutter - 버튼을 사용하여 목록에 아이콘을 추가하고 공급자 상태 관리를 사용하여 UI를 적극적으로 업데이트
- amazon web services - CloudFormation을 사용하여 DynamoDB에 대한 TimeToLiveSpecification 업데이트
- 공용 API 용 DOCUMENT를 사용하여 Angular 10 Guard를 내보내는 방법
- laravel - livewire를 사용하여 테이블의 하위 구성 요소를 어떻게 업데이트 할 수 있습니까?
- JavaScript/jQuery를 사용하여 localStorage 항목 업데이트?
- javascript - MongoDb 업데이트 참조
- Python docx2txt를 사용하여 Word 문서에서 이미지 추출
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- JavaScript 변수를 HTML div에 '출력'하는 방법
- python - 문자열에서 특정 문자 제거
$rename 연산자 (이 질문이 게시 된 후 한 달에 소개됨)를 사용하면 값을 수정할 필요가없는 이런 종류의 작업을 쉽게 수행 할 수 있습니다.
일부 테스트 문서 삽입
와이즈 비즈 사용 연산자
결과