복붙노트

[MONGODB] MongoDB를에 버전 데이터를 구현하는 방법

MONGODB

MongoDB를에 버전 데이터를 구현하는 방법

당신은 당신이 MongoDB를에 버전 데이터를 구현하는 것이 어떻게 여러분의 생각을 공유 할 수 있습니다. (I 카산드라에 대한 비슷한 질문을했습니다. 당신은 DB가하십시오 점유율을 더 나은 어떤 생각이있는 경우)

내가 간단한 주소록에 버전 기록 할 필요가 있다고 가정하자. (주소록 레코드는 평면 JSON 객체로 저장됩니다). 나는 역사를 기대 :

나는 다음과 같은 접근 방법을 고려 중이 야 :

해결법

  1. ==============================

    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. ==============================

    2.다른 응답으로 처리되지 않은 일부 측면을 다룬다 "Vermongo"라는 버전 방식이있다.

    다른 응답으로 처리되지 않은 일부 측면을 다룬다 "Vermongo"라는 버전 방식이있다.

    이러한 문제 중 하나는 다른 하나는 문서를 삭제하고, 동시 업데이트입니다.

    Vermongo는 그림자 컬렉션에서 전체 문서의 복사본을 저장합니다. 일부 사용 사례를 들어이 너무 많은 오버 헤드가 발생할 수 있습니다, 그러나 나는 또한 많은 일을 간단하게 생각합니다.

    https://github.com/thiloplanz/v7files/wiki/Vermongo

  3. ==============================

    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. ==============================

    4.당신이 준비 - 투 - 롤 솔루션을 찾고 있다면 -

    당신이 준비 - 투 - 롤 솔루션을 찾고 있다면 -

    Mongoid 간단한 버전이 내장되어

    http://mongoid.org/en/mongoid/docs/extras.html#versioning

    mongoid-역사는 감사와 훨씬 더 복잡한 솔루션을 제공하는 루비 플러그인이며, 실행 취소 및 다시 실행

    https://github.com/aq1018/mongoid-history

  5. ==============================

    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. ==============================

    6.당신은 몽구스를 사용하는 경우, 내가 JSON 패치 형식의 유용한 구현으로 다음과 같은 플러그인을 발견했다

    당신은 몽구스를 사용하는 경우, 내가 JSON 패치 형식의 유용한 구현으로 다음과 같은 플러그인을 발견했다

    몽구스 - 패치 내역

  7. ==============================

    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. ==============================

    8.나는 유성 / MongoDB의 프로젝트 패키지 아래를 사용하고, 그리고 그것을 잘 작동, 가장 큰 장점은, 같은 문서의 배열 내에서 액세스 변화의 역사에 대한 추가 간행물 또는 미들웨어 따라서 필요를 역사 / 수정을 저장 없다는 것입니다 . 그것은 이전 버전의 제한된 수의 지원할 수 있습니다 (예를. 지난 10 버전), 또한 (모든 변경 한 버전이 적용됩니다 특정 기간 내에 발생하므로) 변화 연결을 지원합니다.

    나는 유성 / MongoDB의 프로젝트 패키지 아래를 사용하고, 그리고 그것을 잘 작동, 가장 큰 장점은, 같은 문서의 배열 내에서 액세스 변화의 역사에 대한 추가 간행물 또는 미들웨어 따라서 필요를 역사 / 수정을 저장 없다는 것입니다 . 그것은 이전 버전의 제한된 수의 지원할 수 있습니다 (예를. 지난 10 버전), 또한 (모든 변경 한 버전이 적용됩니다 특정 기간 내에 발생하므로) 변화 연결을 지원합니다.

    nicklozon / 유성 컬렉션 수정

    또 다른 사운드 옵션은 유성 Vermongo을 (여기)를 사용하는 것입니다

  9. from https://stackoverflow.com/questions/4185105/ways-to-implement-data-versioning-in-mongodb by cc-by-sa and MIT license