2011-12-05 3 views
6

분석 시스템을 만들고 있지만 API 호출은 순 사용자 ID를 제공하지만 시퀀스가 ​​아니며 너무 희박합니다.고유 한 사용자 ID 시퀀스를 저장하기 위해 MongoDB의 자동 증가

각 고유 사용자 ID에 비트 맵/비트 세트의 분석 데이터 포인트를 표시하는 자동 증가 ID를 제공해야합니다. 따라서 첫 번째 사용자는 bitarray의 첫 번째 비트에 해당하고 두 번째 사용자는 비트 배열의 두 번째 비트가됩니다.

MongoDB에서 증분 고유 사용자 ID를 생성하는 견고하고 빠른 방법은 있습니까? 당신이 할 수있는

+0

나는 너와 같은 문제를 어떻게 만났는지, 비트셋 위치를 설정하는 ID를 생성하는 방법. 이 문제를 해결 했습니까? – brucenan

답변

5

하지만해야하지 http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

몽고의 각 개체가 이미 ID를 가지고 있으며, 그들이 삽입 순서로 정렬됩니다. 사용자 객체 컬렉션을 가져 와서 반복하고 증분 된 ID로 사용하면 무엇이 잘못됩니까? 어쨌든 일종의지도 축소 작업을 수행하십시오.

+0

문제는 동시입니다. iterate는 중복 증분 ID를 방출합니다. – est

+0

이 ID는 데이터 저장이 아닌 분석에만 필요합니다. IIUC, 배열의 인덱스로만 순차적 ID가 필요하므로 비트 셋을 빌드 할 수 있습니다. 이 incremental ID를 데이터베이스에 저장하지 않고도 달성 할 수 있으며 클라이언트에 데이터를 가져 오지 않고 비트 어레이를 구축 할 수 있습니다. –

+0

반복마다 incr ID를 얻는 것은 현명하지 못합니다. 특히 데이터 포인트 당 수백만 명의 사용자를 다루는 것이 좋습니다. Dong MAU는 30x 반복을 필요로합니다. – est

11

답변에 따르면 findAndModify를 사용하여 순차적 ID를 생성 할 수 있습니다.

하지만 나는 그렇게해서는 안된다는 의견에 강력히 동의합니다. 그것은 모두 귀하의 비즈니스 요구에 달려 있습니다. ID가 12 바이트이면 자원을 많이 소비 할 수 있으며 향후 확장 성 문제가 발생할 수 있습니다.

자세한 답변은 here입니다. 나는 다음을 사용하는 것이 좋습니다

+0

당신이 원한다면 나는 동의하지 않는다. 그것은 .increateIndex ({ "number": 1}, {unique : true})에 대한 mongo inbuilt 기능이기 때문에 하나는 증분을 나타내며 -1은 그렇지 않다면 –

-5

... 그것은 나를 위해 일한 :)

db.master.insert({ 
    "id": db.master.find().count()+1, 
    "ip": "123.456.789.101", 
    "port": "19132", 
    "api-key": "1234", 
    "name": "TEST "+(db.master.find().count()+1) 
}) 

사용 (db.master.find()을.() + 1 셀) 내 필요를 위해 일했다.

+14

을 상상해 보자. 5 개의 레코드가 있습니다. 다음 ID는 6이어야하지만 일부 레코드를 삭제했습니다. 3. 이제 순서 1,2,4,5가 있습니다. 당신의 방식대로 다음 id는 5가 될 것입니다 (왜냐하면 count = 4 + 1이기 때문입니다). 그리고 마지막 순서는 1,2,4,5,5입니다. –

4

먼저 카운터 컬렉션을 만들어 모든 시퀀스 필드의 마지막 시퀀스 값을 추적합니다.

function getNextSequenceValue(sequenceName){ 
     var sequenceDocument = db.counters.findAndModify({ 
     query:{_id: sequenceName }, 
     update: {$inc:{sequence_value:1}}, 
     new:true 
      }); 
     return sequenceDocument.sequence_value; 
     } 

삽입 두 문서 :

  db.products.insert({ 
      "_id":getNextSequenceValue("tid"), 
      "product":"Samsung", 
      "category":"mobiles" 
      }) 


      db.products.insert({ 
      "_id":getNextSequenceValue("tid"), 
      "product":"Samsung S3", 
      "category":"mobiles" 
       }) 

db.counters.insert({_id:"tid",sequence_value:0}) 

만들기 자바 스크립트 기능 -

 db.createCollection("counters") 

은 카운터 컬렉션에서이 시퀀스 문서를 삽입하려면 다음 코드를 사용하여 도망 삽입 문서 :

  db.prodcuts.find() 

OUTPUT

{ "_id": 1, "제품": "삼성", "카테고리" "휴대폰"}

{ "_id": 2 "제품": "삼성 S3", "카테고리" "휴대폰"} 나는이 오래된 질문이지만, 내가 후대에 대한 내 대답을 게시하여야한다 알고

3

은 ...

그것은 싸이에 따라 달라집니다 당신이 짓고있는 줄기와 특정 사업 규칙이 그 자리에 있어야합니다.

MongoDb, C# (백엔드 API) 및 각도 (프론트 엔드 웹 앱)에 중간 규모 이상의 대규모 CRM을 구축 중이며 특정 엔터티를 선택하기 위해 각도 라우팅에 사용하기에는 ObjectId가 전혀 발견되지 않았습니다. API 컨트롤러 라우팅과 동일합니다.

위 제안은 제 프로젝트에서 완벽하게 작동했습니다.

db.contacts.insert({ 
"id":db.contacts.find().Count()+1, 
"name":"John Doe", 
"emails":[ 
    "[email protected]", 
    "[email protected]" 
], 
"phone":"555111322", 
"status":"Active" 
}); 

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

비즈니스 규칙에 따르면 자사의 SLA 때문에 업무 자료 또는 고객 기록을 내가 작성한 응용 프로그램의 잠재적 수명보다 오래 삭제할 수 없으므로 간단히 기록을 남깁니다. enum "Status"는 "Active"또는 "Deleted"입니다. UI에서 무언가를 삭제할 수 있으며 "연락처가 삭제되었습니다"라고 표시되지만 응용 프로그램이 완료되면 연락처 상태가 "삭제됨"으로 변경되며 응용 프로그램이 연락처 목록에 대한 리포지토리를 호출하면 필자는 데이터를 클라이언트 응용 프로그램에 보내기 전에 삭제 된 레코드를 제거하십시오. 데이터를 삭제하지 않을 경우

따라서, db.collection.find(). 그것을 ... + 1은 나를위한 완벽한 솔루션입니다) (카운트

그것은 모두를 위해 작동하지 않습니다 만, 잘 작동합니다.

+0

mongodb에서 db.xxx.find.count + 1과 같은 함수 대신 함수와 카운터 시퀀스를 사용해야한다는 특별한 이유가 있습니까? 어쩌면 전보 처리가 엉망진창일까요? 귀하의 솔루션은 웹 서버 환경에서 잘 작동합니까? ' – ckinfos

+0

이것은 동시 설치에서 좋지 않을 것입니다. 같은 시간에 카운트 한 경우 동일한 _id로 문서를 쉽게 얻을 수 있습니다. – zephos2014

관련 문제