[MONGODB] MongoDB를에 버전 데이터를 구현하는 방법
MONGODBMongoDB를에 버전 데이터를 구현하는 방법
당신은 당신이 MongoDB를에 버전 데이터를 구현하는 것이 어떻게 여러분의 생각을 공유 할 수 있습니다. (I 카산드라에 대한 비슷한 질문을했습니다. 당신은 DB가하십시오 점유율을 더 나은 어떤 생각이있는 경우)
내가 간단한 주소록에 버전 기록 할 필요가 있다고 가정하자. (주소록 레코드는 평면 JSON 객체로 저장됩니다). 나는 역사를 기대 :
나는 다음과 같은 접근 방법을 고려 중이 야 :
해결법
-
==============================
1.이에 다이빙은 첫 번째 큰 질문 "당신은 어떻게 저장 체인지하겠습니까?"
이에 다이빙은 첫 번째 큰 질문 "당신은 어떻게 저장 체인지하겠습니까?"
내 개인적인 접근 방식은 저장 차이점에있을 것이다. 이러한 차이점의 표시가 특별한 조치가 정말이기 때문에, 나는 다른 "역사"컬렉션의 차이점을 둘 것입니다.
나는 메모리 공간을 절약하기 위해 다른 모음을 사용합니다. 당신은 일반적으로 간단한 쿼리에 대한 전체 역사를 원하지 않는다. 데이터를 쿼리 그래서 객체에서 역사를 유지하여 당신은 또한 일반적으로 액세스 메모리의 그것을 유지할 수 있습니다.
쉽게 내 인생을 위해, 나는 역사 문서 타임 스탬프 차이점의 사전을 포함 할 것이다. 이 같은:
{ _id : "id of address book record", changes : { 1234567 : { "city" : "Omaha", "state" : "Nebraska" }, 1234568 : { "city" : "Kansas City", "state" : "Missouri" } } }
정말 쉽게 내 인생을 위해, 나는 내 데이터에 액세스하는 데 사용하는 내 데이터 객체 (어떤 EntityWrapper)의이 부분을 만들 것입니다. 일반적으로 이러한 객체를 사용하면 쉽게 같은 시간에 이러한 변경을 할 수있는 저장 () 메소드를 오버라이드 (override) 할 수 있도록하는 것이 역사의 몇 가지 형태가있다.
업데이트 : 2015-10
이제 JSON의 차이점을 처리하기위한 사양이 같다. 이것은 차이점 / 변경 사항을 저장하는보다 강력한 방법처럼 보인다.
-
==============================
2.다른 응답으로 처리되지 않은 일부 측면을 다룬다 "Vermongo"라는 버전 방식이있다.
다른 응답으로 처리되지 않은 일부 측면을 다룬다 "Vermongo"라는 버전 방식이있다.
이러한 문제 중 하나는 다른 하나는 문서를 삭제하고, 동시 업데이트입니다.
Vermongo는 그림자 컬렉션에서 전체 문서의 복사본을 저장합니다. 일부 사용 사례를 들어이 너무 많은 오버 헤드가 발생할 수 있습니다, 그러나 나는 또한 많은 일을 간단하게 생각합니다.
https://github.com/thiloplanz/v7files/wiki/Vermongo
-
==============================
3.여기에 현재 버전 및 모든 이전 버전에 대한 하나의 문서를 사용하여 다른 솔루션입니다 :
여기에 현재 버전 및 모든 이전 버전에 대한 하나의 문서를 사용하여 다른 솔루션입니다 :
{ _id: ObjectId("..."), data: [ { vid: 1, content: "foo" }, { vid: 2, content: "bar" } ] }
데이터는 모든 버전이 포함되어 있습니다. 데이터 배열은 새 버전은 $ 배열의 끝으로 밀어 얻을 것이다, 주문한다. data.vid은 증가하는 번호입니다 버전 ID입니다.
최신 버전을 가져 오기 :
find( { "_id":ObjectId("...") }, { "data":{ $slice:-1 } } )
VID하여 특정 버전을 가져 오기 :
find( { "_id":ObjectId("...") }, { "data":{ $elemMatch:{ "vid":1 } } } )
단지 지정된 필드를 반환합니다 :
find( { "_id":ObjectId("...") }, { "data":{ $elemMatch:{ "vid":1 } }, "data.content":1 } )
(동시 삽입 / 업데이트 방지) : 새 버전을 삽입
update( { "_id":ObjectId("..."), $and:[ { "data.vid":{ $not:{ $gt:2 } } }, { "data.vid":2 } ] }, { $push:{ "data":{ "vid":3, "content":"baz" } } } )
2는 현재 최신 버전의 VID이며 3 삽입하기 새로운 버전입니다. 가장 최근 버전의 장해를 필요로하기 때문에, 다음 버전의 장해를받을 수 있나요 쉽게 : = oldVID + 1 nextVID.
$ 및 조건은이 최신 장해임을 보장합니다.
이 방법은 고유 인덱스에 대한 필요가 없습니다,하지만 애플리케이션 로직은 삽입에 장해를 증가 돌봐있다.
특정 버전을 제거합니다 :
update( { "_id":ObjectId("...") }, { $pull:{ "data":{ "vid":2 } } } )
즉입니다!
(문서 제한 당 16메가바이트 기억)
-
==============================
4.당신이 준비 - 투 - 롤 솔루션을 찾고 있다면 -
당신이 준비 - 투 - 롤 솔루션을 찾고 있다면 -
Mongoid 간단한 버전이 내장되어
http://mongoid.org/en/mongoid/docs/extras.html#versioning
mongoid-역사는 감사와 훨씬 더 복잡한 솔루션을 제공하는 루비 플러그인이며, 실행 취소 및 다시 실행
https://github.com/aq1018/mongoid-history
-
==============================
5.나는 게시 된 초안과 데이터의 역사적 버전의 수용이 솔루션을 통해 일 :
나는 게시 된 초안과 데이터의 역사적 버전의 수용이 솔루션을 통해 일 :
{ published: {}, draft: {}, history: { "1" : { metadata: <value>, document: {} }, ... } }
본인은 여기에 모델을 설명 : http://software.danielwatrous.com/representing-revision-data-in-mongodb/
자바에서 이런 일을 구현할 수 그들을 위해, 여기에 예입니다 :
http://software.danielwatrous.com/using-java-to-work-with-versioned-data/
만약 당신이 좋아하면, 당신은 포크 할 수있는 모든 코드를 포함
https://github.com/dwatrous/mongodb-revision-objects
-
==============================
6.당신은 몽구스를 사용하는 경우, 내가 JSON 패치 형식의 유용한 구현으로 다음과 같은 플러그인을 발견했다
당신은 몽구스를 사용하는 경우, 내가 JSON 패치 형식의 유용한 구현으로 다음과 같은 플러그인을 발견했다
몽구스 - 패치 내역
-
==============================
7.또 다른 옵션은 사용 몽구스 - 역사 플러그인이다.
또 다른 옵션은 사용 몽구스 - 역사 플러그인이다.
let mongoose = require('mongoose'); let mongooseHistory = require('mongoose-history'); let Schema = mongoose.Schema; let MySchema = Post = new Schema({ title: String, status: Boolean }); MySchema.plugin(mongooseHistory); // The plugin will automatically create a new collection with the schema name + "_history". // In this case, collection with name "my_schema_history" will be created.
-
==============================
8.나는 유성 / MongoDB의 프로젝트 패키지 아래를 사용하고, 그리고 그것을 잘 작동, 가장 큰 장점은, 같은 문서의 배열 내에서 액세스 변화의 역사에 대한 추가 간행물 또는 미들웨어 따라서 필요를 역사 / 수정을 저장 없다는 것입니다 . 그것은 이전 버전의 제한된 수의 지원할 수 있습니다 (예를. 지난 10 버전), 또한 (모든 변경 한 버전이 적용됩니다 특정 기간 내에 발생하므로) 변화 연결을 지원합니다.
나는 유성 / MongoDB의 프로젝트 패키지 아래를 사용하고, 그리고 그것을 잘 작동, 가장 큰 장점은, 같은 문서의 배열 내에서 액세스 변화의 역사에 대한 추가 간행물 또는 미들웨어 따라서 필요를 역사 / 수정을 저장 없다는 것입니다 . 그것은 이전 버전의 제한된 수의 지원할 수 있습니다 (예를. 지난 10 버전), 또한 (모든 변경 한 버전이 적용됩니다 특정 기간 내에 발생하므로) 변화 연결을 지원합니다.
nicklozon / 유성 컬렉션 수정
또 다른 사운드 옵션은 유성 Vermongo을 (여기)를 사용하는 것입니다
from https://stackoverflow.com/questions/4185105/ways-to-implement-data-versioning-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의에서 날짜별로 그룹화 (0) | 2019.12.01 |
---|---|
[MONGODB] 몽구스 오류 캐스트 ObjectId가 경로에서 값 XXX 실패 "_id"에 무엇입니까? (0) | 2019.12.01 |
[MONGODB] 사용자 이름과 암호를 사용하여 MongoDB를 확보하는 방법 (0) | 2019.12.01 |
[MONGODB] 일치하는 파이프 라인에서 문서의 집계 $ 조회 총 크기는 최대 문서 크기를 초과 (0) | 2019.12.01 |
[MONGODB] 어떻게 Node.js를에서 몽구스와 쪽수를 매기다? (0) | 2019.12.01 |