복붙노트

[MONGODB] 고유 한 사용자 ID의 저장 순서에 MongoDB의 자동 증가

MONGODB

고유 한 사용자 ID의 저장 순서에 MongoDB의 자동 증가

내가 분석 시스템을 제작하고, API 호출은 고유 한 사용자 ID를 제공 할 수 있지만, 순서에없는 너무 스파 스.

나는 각각의 고유 한 사용자 ID에게 bitarray / 비트 세트의 분석 데이터 포인트를 표시 할 수있는 자동 증가 ID를 제공해야합니다. 제 1 사용자가 조우 bitarray의 첫 번째 비트에 해당 할 수 있도록, 사용자는 제 bitarray 등의 2 비트 것

그래서 MongoDB의 증분 고유 한 사용자 ID를 생성하는 견고하고 빠른 방법은 무엇입니까?

해결법

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

    1.당신이 할 수있는,하지만 당신은 안 https://web.archive.org/web/20151009224806/http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

    당신이 할 수있는,하지만 당신은 안 https://web.archive.org/web/20151009224806/http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

    몽고 각 개체가 이미 ID를 가지며, 이들은 신청서에 정렬된다. 그것을 반복 및 증분 ID로 사용, 사용자 개체의 컬렉션을 받고 문제는 무엇인가? 어의 종류에 갈 완전히 작업을지도-감소

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

    2.선택한 답변이 말했듯이 당신은 순차적으로 ID를 생성하는 findAndModify를 사용할 수 있습니다.

    선택한 답변이 말했듯이 당신은 순차적으로 ID를 생성하는 findAndModify를 사용할 수 있습니다.

    그러나 나는 강하게 당신이 그렇게 안된다는 의견에 동의하지 않는다. 그것은 모든 비즈니스 요구 사항에 따라 달라집니다. 12 바이트 ID를 갖는 일이 매우 많이 소요 자원 및 향후 확장 성이 크게 문제가 발생할 수 있습니다.

    여기 답을 설명했다.

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

    3.나는이 오래된 질문이다 알지만, 후대에 대한 내 대답을 게시하여야한다 ...

    나는이 오래된 질문이다 알지만, 후대에 대한 내 대답을 게시하여야한다 ...

    그것은 당신이 구축되는 시스템과 장소의 특정 비즈니스 규칙에 따라 달라집니다.

    나는 대규모하여 MongoDB에서 CRM, C 번호 (백엔드 API) 및 각도 (프런트 엔드 웹 응용 프로그램)에 적당한을 구축하고 특정 엔티티를 선택하는 각도 라우팅에 사용 ObjectId가이 완전히 끔찍한 발견하고있다. API 컨트롤러 라우팅과 동일합니다.

    제안은 위의 내 프로젝트에 대한 완벽했다.

    db.contacts.insert({
     "id":db.contacts.find().Count()+1,
     "name":"John Doe",
     "emails":[
        "john@doe.com",
        "john.doe@business.com"
     ],
     "phone":"555111322",
     "status":"Active"
    });
    

    그 이유는 내 경우를 위해 완벽하다, 모든 경우는 아니지만 당신이 컬렉션에서 3 개 레코드를 삭제할 경우 위의 주석 상태로, 당신은 충돌을 얻을 것입니다.

    내 사업으로 인해 우리 집 SLA의, 우리는 내가 쓰고 있어요 응용 프로그램의 잠재적 인 수명보다 오래 대응 데이터 또는 고객 레코드를 삭제할 수 없으며, 열거 "상태"와 그에 대한, 나는 단순히 마크 기록을 그 상태 규칙 중 하나 인 "활성"또는 "삭제". 당신은 UI에서 뭔가를 삭제할 수 있습니다, 그것은 "연락처가 삭제 된"하지만 수행 한 모든 응용 프로그램이 "삭제"에 접촉 앱이 연락처 목록에 대한 respository를 호출, I 필터의 상태를 변경 말할 것이다 밖으로는 클라이언트 응용 프로그램에 데이터를 밀어 전에 기록을 삭제.

    따라서, db.collection.find (). COUNT () + 1은 나를위한 완벽한 솔루션입니다 ...

    그것은 모두를 위해 작동하지 않습니다,하지만 당신은 데이터를 삭제하지 않을 경우, 그것을 잘 작동합니다.

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

    4.첫 번째 레코드 추가해야

    첫 번째 레코드 추가해야

    "_id" = 1    in your db
    
    $database = "demo";
    $collections ="democollaction";
    echo getnextid($database,$collections);
    
    function getnextid($database,$collections){
    
         $m = new MongoClient();
        $db = $m->selectDB($database);
        $cursor = $collection->find()->sort(array("_id" => -1))->limit(1);
        $array = iterator_to_array($cursor);
    
        foreach($array as $value){
    
    
    
            return $value["_id"] + 1;
    
        }
     }
    
  5. ==============================

    5.내 목적이을 발견하는 가장 좋은 방법은 당신이 현장에서 그 위해가 최대 값에서 증가했다, 나는 다음과 같은 구문을 사용 :

    내 목적이을 발견하는 가장 좋은 방법은 당신이 현장에서 그 위해가 최대 값에서 증가했다, 나는 다음과 같은 구문을 사용 :

    maxObj = db.CollectionName.aggregate([
      {
        $group : { _id: '$item', maxValue: { $max: '$fieldName' } } 
      }
    ];
    fieldNextValue = maxObj.maxValue + 1;
    

    $ fieldName에 당신의 필드의 이름이지만, $ 기호없이.

    하는 콜렉션은 컬렉션의 이름입니다.

    나는 () 수를 사용하고 있지 않다 그 이유는 생산 된 값이 기존 값을 만날 수 있다는 것입니다.

    시행 고유 인덱스의 생성은 좀 더 안전하게 만들 수 있습니다 :

    db.CollectionName.createIndex( { "fieldName": 1 }, { unique: true } )
    
  6. ==============================

    6.나는 즉 내가 식별자로 사용할 수있는 고유 번호를 생성에 관심이 비슷한 문제를 가지고 있지만 필요가 없습니다. 나는 다음과 같은 솔루션을 함께했다. 컬렉션을 초기화 할 수 첫째 :

    나는 즉 내가 식별자로 사용할 수있는 고유 번호를 생성에 관심이 비슷한 문제를 가지고 있지만 필요가 없습니다. 나는 다음과 같은 솔루션을 함께했다. 컬렉션을 초기화 할 수 첫째 :

    fun create(mongo: MongoTemplate) {
            mongo.db.getCollection("sequence")
                    .insertOne(Document(mapOf("_id" to "globalCounter", "sequenceValue" to 0L)))
        }
    

    그리고 독특한 (오름차순) 숫자를 반환하는 서비스 :

    @Service
    class IdCounter(val mongoTemplate: MongoTemplate) {
    
        companion object {
            const val collection = "sequence"
        }
    
        private val idField = "_id"
        private val idValue = "globalCounter"
        private val sequence = "sequenceValue"
    
        fun nextValue(): Long {
            val filter = Document(mapOf(idField to idValue))
            val update = Document("\$inc", Document(mapOf(sequence to 1)))
            val updated: Document = mongoTemplate.db.getCollection(collection).findOneAndUpdate(filter, update)!!
            return updated[sequence] as Long
        }
    }
    

    나는 ID가 다른 솔루션의 일부에서 겪을 수있는 동시 환경에 관련된 약점이 없음을 믿습니다.

  7. from https://stackoverflow.com/questions/8384029/auto-increment-in-mongodb-to-store-sequence-of-unique-user-id by cc-by-sa and MIT license