복붙노트

[MONGODB] MongoDB를 가진 고유 ID

MONGODB

MongoDB를 가진 고유 ID

내가 블로그를 구축한다면 나는 고유 식별자로 블로그 제목을 사용하여 URL을 통해 구문 분석 할 수있다. 그러나, 무엇을 내가 사용하는 번호를 원하는 경우. 당신은 트위터 www.twitter.com/username/statuses/9834542을 얼마나 알아? 사람이 일을 만드는 좋은 방법 알아 냈습니까? "_id"를 사용하는 것은 너무 오래 그것의 방법 이후 밖으로 질문입니다.

해결법

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

    1.당신이 고유성을 보장 할 수있는 한, 당신은 MongoDB의 공급을 "_id"기본을 사용하여 제약이 아닙니다.

    당신이 고유성을 보장 할 수있는 한, 당신은 MongoDB의 공급을 "_id"기본을 사용하여 제약이 아닙니다.

    따라서, 당신이이 번호를 생성하는 방법까지입니다. 당신이 MongoDB를 내부에이 번호를 저장하는 방법을 사용하려면 별도의 컬렉션을 저장하고 필요한 모든 새로운 URL 위해를 증가 할 수있다.

    필드를 증가하는 $ INC 동사를 사용하거나 MongoDB를 원자 적으로 업데이트하거나 값을 증가 할 수있는 방법을 살펴 할 수 있습니다에 의해 달성된다.

  2. ==============================

    2.그것은 findandmodify 명령을 사용하여 수행 할 수 있습니다.

    그것은 findandmodify 명령을 사용하여 수행 할 수 있습니다.

    하자 우리가 특별 징수는 시퀀스의 이름이 고려하고 우리는 포스트 번호 (이름 postid)이 유사한 코드를 사용할 수에 대한 순서를 갖고 싶어 :

    > db.runCommand( { "findandmodify" : "sequences",
                       "query" : { "name" : "postid"},
                       "update" : { $inc : { "id" : 1 }},
                       "new" : true } );
    

    이 명령은 상태 원자 적 갱신 (신규) 문서 함께 반환됩니다. 명령이 성공적으로 완료되면 값 필드는 반환 된 문서가 포함되어 있습니다.

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

    3.당신이 MongoDB의에서 자신의 분야에 고유성 제약 조건을 추가 할 경우, 인덱스를 사용합니다. 그럼 당신은 당신이 번호를 생성하고 고유성을 테스트하려는 해싱 알고리즘을 사용할 수 있습니다. MongoDB를 문서의 예입니다

    당신이 MongoDB의에서 자신의 분야에 고유성 제약 조건을 추가 할 경우, 인덱스를 사용합니다. 그럼 당신은 당신이 번호를 생성하고 고유성을 테스트하려는 해싱 알고리즘을 사용할 수 있습니다. MongoDB를 문서의 예입니다

    db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
    

    어떤 다른 문서와 동일한 이름 및 성으로 문서를 삽입에서 당신을 방지 할 수 있습니다.

    자세한 내용은 문서에서 사용할 수 있습니다.

  4. ==============================

    4.나는 데이터 수집 '순서'를 만들어이 문제를 해결했다 :

    나는 데이터 수집 '순서'를 만들어이 문제를 해결했다 :

    그래서 그것에 대한 DAO를, 모르핀을 사용하고 있습니다. 하지만 당신은 모르핀없이 너무 그것을 할 수 있습니다. 아이디어는 $ 원자 (아마 생략 할 수 인해 updateing 1 인스턴스 만)과 $ 개질제 INC 연산자를 사용하는 것이다.

    순서

    @Entity(value = "sys_sequence", noClassnameStored = true)
    public class SequenceM {
    
        /**
         * Names of entity
         */
        public static enum Entity {
            USER,
            CAPABILITY_HISTORY;
    
            public String getEntityName() {
                return this.name().toLowerCase();
            }
        }
    
        @Id
        private ObjectId uid;
    
        @Property
        @Indexed(unique = true)
        private String name;
    
        @Property
        private Long value;
    
     //..getters/setters/etc
     }
    

    SequenceDAO에 방법 :

    @NotNull
    public Long nextValue(final @NotNull SequenceM.Entity entity) {
        final DB db = this.ds.getDB();
        final WriteConcern writeConcern = getWriteConcern();
    
        //optimization for JVM instance
        synchronized(entity) {
            do {
                SequenceM sequence = findOne("name", entity.getEntityName());
    
                final DBObject q = BasicDBObjectBuilder.start().add("name", entity.getEntityName()).add("value", sequence.getValue()).add("$atomic", 1).get();
                final DBObject o = BasicDBObjectBuilder.start().add("$inc", BasicDBObjectBuilder.start().add("value", 1).get()).get();
    
                WriteResult writeResult = db.getCollection("sys_sequence").update(q, o, false, true, writeConcern);
    
                if(writeResult.getN() == 1) {
                    return sequence.getValue() + 1;
                }
            } while(true);
        }
    }
    
    /**
     * Determining writing concern basing on configuration
     */
    private WriteConcern getWriteConcern() {
        return isOneNodeOnly ? WriteConcern.SAFE : REPLICATION_SAFE;
    }
    

    MongoDB의 구성 (하나 개의 노드 전용 또는 마스터 / 슬레이브 또는 복제 세트) 당신이 올바른 WriteConcern를 사용할 필요에 따라. 하나의 예를 하나의 환경에서 REPLICATION_SAFE 사용 만 무한 루프가 발생합니다.

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

    5.기술적으로, ID 번호를 단축하기에 너무 크다. 그러나, 전술은 채울 수 있습니다. 즉, 따라서 tulizar하는 문자의 수를 줄이고 URL에 더 아름다운 외모, 숫자로 진수에서 전달합니다. 난 정말 여기에 ... 아주 잘 제공

    기술적으로, ID 번호를 단축하기에 너무 크다. 그러나, 전술은 채울 수 있습니다. 즉, 따라서 tulizar하는 문자의 수를 줄이고 URL에 더 아름다운 외모, 숫자로 진수에서 전달합니다. 난 정말 여기에 ... 아주 잘 제공

    function encode(hex) {
        return new Buffer(hex, 'hex').toString('base64').replace('+', '-').replace('/', '_');
    };
    
    function decode(NoHex) {
        return new Buffer( NoHex.replace('-','+').replace('_','/'), 'base64').toString('hex');
    };
    
    IdString= MyDoc._id.toString(); 
    Idencode = encode( IdString ) // 16 Caracters a-Z and 0-9 
    console.log( IdEncode ); //You see That 'aqswedasdfdsadsf'
    IdDecode = decode( IdEncode );
    IdDecode === IdString // Is true!!!
    

    물론이 기술은 몽고, 동일한 ID를 사용합니다.

  6. from https://stackoverflow.com/questions/1352671/unique-ids-with-mongodb by cc-by-sa and MIT license