[MONGODB] MongoDB를 가진 고유 ID
MONGODBMongoDB를 가진 고유 ID
내가 블로그를 구축한다면 나는 고유 식별자로 블로그 제목을 사용하여 URL을 통해 구문 분석 할 수있다. 그러나, 무엇을 내가 사용하는 번호를 원하는 경우. 당신은 트위터 www.twitter.com/username/statuses/9834542을 얼마나 알아? 사람이 일을 만드는 좋은 방법 알아 냈습니까? "_id"를 사용하는 것은 너무 오래 그것의 방법 이후 밖으로 질문입니다.
해결법
-
==============================
1.당신이 고유성을 보장 할 수있는 한, 당신은 MongoDB의 공급을 "_id"기본을 사용하여 제약이 아닙니다.
당신이 고유성을 보장 할 수있는 한, 당신은 MongoDB의 공급을 "_id"기본을 사용하여 제약이 아닙니다.
따라서, 당신이이 번호를 생성하는 방법까지입니다. 당신이 MongoDB를 내부에이 번호를 저장하는 방법을 사용하려면 별도의 컬렉션을 저장하고 필요한 모든 새로운 URL 위해를 증가 할 수있다.
필드를 증가하는 $ INC 동사를 사용하거나 MongoDB를 원자 적으로 업데이트하거나 값을 증가 할 수있는 방법을 살펴 할 수 있습니다에 의해 달성된다.
-
==============================
2.그것은 findandmodify 명령을 사용하여 수행 할 수 있습니다.
그것은 findandmodify 명령을 사용하여 수행 할 수 있습니다.
하자 우리가 특별 징수는 시퀀스의 이름이 고려하고 우리는 포스트 번호 (이름 postid)이 유사한 코드를 사용할 수에 대한 순서를 갖고 싶어 :
> db.runCommand( { "findandmodify" : "sequences", "query" : { "name" : "postid"}, "update" : { $inc : { "id" : 1 }}, "new" : true } );
이 명령은 상태 원자 적 갱신 (신규) 문서 함께 반환됩니다. 명령이 성공적으로 완료되면 값 필드는 반환 된 문서가 포함되어 있습니다.
-
==============================
3.당신이 MongoDB의에서 자신의 분야에 고유성 제약 조건을 추가 할 경우, 인덱스를 사용합니다. 그럼 당신은 당신이 번호를 생성하고 고유성을 테스트하려는 해싱 알고리즘을 사용할 수 있습니다. MongoDB를 문서의 예입니다
당신이 MongoDB의에서 자신의 분야에 고유성 제약 조건을 추가 할 경우, 인덱스를 사용합니다. 그럼 당신은 당신이 번호를 생성하고 고유성을 테스트하려는 해싱 알고리즘을 사용할 수 있습니다. MongoDB를 문서의 예입니다
db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
어떤 다른 문서와 동일한 이름 및 성으로 문서를 삽입에서 당신을 방지 할 수 있습니다.
자세한 내용은 문서에서 사용할 수 있습니다.
-
==============================
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.기술적으로, 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를 사용합니다.
from https://stackoverflow.com/questions/1352671/unique-ids-with-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽고는 운영자 성능에 $ (0) | 2019.12.17 |
---|---|
[MONGODB] "ID"와 "_id"필드 MongoDB의에서 차이 (0) | 2019.12.17 |
[MONGODB] MongoDB를에 정렬 사례를 구분 (0) | 2019.12.17 |
[MONGODB] 문서에서 다른 필드의 값을 업데이트 필드 [중복] (0) | 2019.12.17 |
[MONGODB] PHP MongoDB를 : 치명적인 오류 : 클래스 'MongoClient'을 (를) 찾을 수 없습니다 (0) | 2019.12.17 |