복붙노트

[MONGODB] 어떻게하여 MongoDB의 자동 증가 차 ID를 구현합니까?

MONGODB

어떻게하여 MongoDB의 자동 증가 차 ID를 구현합니까?

그냥 MYSQL처럼, 나는 증분 ID를 원한다.

해결법

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

    1.MongoDB를 수평으로 스케일링하기위한 것이다. 이 경우, 자동 증가는 ID 충돌로 이어질 것입니다. ID가 훨씬 더 GUID / UUID처럼 보이는 이유입니다.

    MongoDB를 수평으로 스케일링하기위한 것이다. 이 경우, 자동 증가는 ID 충돌로 이어질 것입니다. ID가 훨씬 더 GUID / UUID처럼 보이는 이유입니다.

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

    2.당신은 MongoDB의의 findAndModify 명령을 사용해야합니다. 그것으로, 당신은 원자 적으로 선택하고 필드를 증가 할 수 있습니다.

    당신은 MongoDB의의 findAndModify 명령을 사용해야합니다. 그것으로, 당신은 원자 적으로 선택하고 필드를 증가 할 수 있습니다.

    db.seq.findAndModify({
      query: {"_id": "users"},
      update: {$inc: {"seq":1}},
      new: true
    });
    

    이것은 당신이 다음 삽입하기 전에 문서에 추가 할 수있는 사용자 수집을위한 카운터를 증가 할 것이다. 이 원자의 때문에, 당신은 ID를 충돌의 결과로 경쟁 조건에 대해 걱정할 필요가 없습니다.

    그것은 MySQL을의 AUTO_INCREMENT 플래그 원활한로 아니지만, 당신은 훨씬 더 MySQL- 결과, 투명하게 증가 및 수익 ID에 findAndModify를 사용하는 공장을 구현할 수 있도록 또한, 일반적으로 사용자의 몽고 드라이버에서 자신의 ID 팩토리를 지정하는 옵션이 있습니다 같은 경험.

    이 방법의 단점은 모든 삽입 시퀀스의 컬렉션 쓰기 잠금에 의존하기 때문에, 당신은 쓰기를 많이하고 있다면, 당신은 꽤 빨리 그에 병목 끝낼 수 있다는 것입니다. 방금 모음에서 문서를 삽입 순서로 정렬되는 것을 보장하려는 경우, 출장 컬렉션 봐.

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

    3.MongoDB의 자동 증분 _id (또는 사용자 정의 키)에이 방법을 제공합니다.

    MongoDB의 자동 증분 _id (또는 사용자 정의 키)에이 방법을 제공합니다.

    여기에서 우리는 우리가이 함수를 호출 할 때 1마다 키의 최대 수를 저장 수집 및 증가를 작성해야합니다.

    1. 저장 기능

    function getNextSequence(collectionName) {
       var ret = db.counters.findAndModify({
                   query: { _id: collectionName },
                   update: { $inc: { seq: 1 } },
                   new: true,
                   upsert: true
                 });
    
       return ret.seq;
    }
    

    2. 삽입 DOC

    db.users.insert({
      _id: getNextSequence("USER"),
      name: "Nishchit."
    })
    

    이 패턴에서, 낙관적 루프 증분 _id 값과 계산 값 _id 문서를 삽입하려는 시도를 계산한다. 삽입에 성공하면 루프가 종료됩니다. 삽입이 성공할 때까지 그렇지 않으면, 루프는 가능한 _id 값을 반복합니다.

    1. 저장 기능

    function insertDocument(doc, targetCollection) {
    
        while (1) {
    
            var cursor = targetCollection.find( {}, { _id: 1 } ).sort( { _id: -1 } ).limit(1);
    
            var seq = cursor.hasNext() ? cursor.next()._id + 1 : 1;
    
            doc._id = seq;
    
            var results = targetCollection.insert(doc);
    
            if( results.hasWriteError() ) {
                if( results.writeError.code == 11000 /* dup key */ )
                    continue;
                else
                    print( "unexpected error inserting data: " + tojson( results ) );
            }
    
            break;
        }
    }
    

    2. 삽입 DOC

    var myCollection = db.USERS;
    
    insertDocument(
       {
         name: "Nishchit Dhanani"
       },
       myCollection
    );
    

    MongoDB의에서 공식 문서.

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

    4.당신이 당신의 데이터를보다 (파편 일명) 하나의 서버가 아닌 걸치는 의심되는 경우 다음 데니스로 가서 기본 ObjectId가를 사용합니다.

    당신이 당신의 데이터를보다 (파편 일명) 하나의 서버가 아닌 걸치는 의심되는 경우 다음 데니스로 가서 기본 ObjectId가를 사용합니다.

    당신이 INT / 긴 아이디 (더 나은 URL을 보이는)을 선호하는 경우에 당신은 크리스 제안으로 findAndModify를 사용하여 발전기의 순진 구현을 시작할 수 있습니다. 시 / 성능 / 잠금 시작하면 안녕 / lo 알고리즘을 구현하기 위해 발전기를 업그레이드 할 수 있습니다 문제가 될 경우. 이것은 '서열'컬렉션 훨씬 덜 스트레스를 발생합니다. 실제적으로이 문제를 제거 할 수 있습니다. (클라이언트 측 생성기는 '풀'를 사용하고 더 이상 무료 식별자가있는 경우에만 DB에 연락한다)

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

    5.자동 증가가 지원되지 동안, 당신은 쉽게 증분 값을 발행하여 자신의 작은 클래스를 구현할 수 있습니다.

    자동 증가가 지원되지 동안, 당신은 쉽게 증분 값을 발행하여 자신의 작은 클래스를 구현할 수 있습니다.

    내가 PHP에서 작은 클래스를 쓴, 그래서 나는,이 기능을 자신을 필요로했다. 내 블로그에 대해 쓴, 여기, 여기 좀 봐

  6. ==============================

    6.@TIMEX가 : 당신이 일련 번호를 찾고 있다면 확인은 아래 링크를 경우하는 것은, 당신을 도울 수없는 ID (ID는 몽고에 의해 예약되어 사촌)

    @TIMEX가 : 당신이 일련 번호를 찾고 있다면 확인은 아래 링크를 경우하는 것은, 당신을 도울 수없는 ID (ID는 몽고에 의해 예약되어 사촌)

    http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

    @Dennis 버튼 자동 증가 사용자가 충돌을 일으킬하지 않는 경우? 나는 그것이 충돌을 피할 수 있도록 따라서 몽고 DB는 자신의 _ID를 사용, 느낌이 있지만, 사용자의 소원은 실행 순서로 열을 가지고 있다면 그들은 그것을 가지고 무료입니다

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

    7.

    var mongoose = require('mongoose'),
        Schema = mongoose.Schema,
        autoIncrement = require('mongoose-auto-increment');
    
    var connection = mongoose.createConnection("mongodb://localhost/myDatabase");
    
    autoIncrement.initialize(connection);
    
    var bookSchema = new Schema({
        author: { type: Schema.Types.ObjectId, ref: 'Author' },
        title: String,
        genre: String,
        publishDate: Date
    });
    
    bookSchema.plugin(autoIncrement.plugin, 'Book');
    var Book = connection.model('Book', bookSchema);
    
  8. from https://stackoverflow.com/questions/4356993/how-do-you-implement-an-auto-incrementing-primary-id-in-mongodb by cc-by-sa and MIT license