2011-12-05 12 views
6

के अनुक्रम को संग्रहीत करने के लिए मोंगो डीबी में ऑटो वृद्धि, मैं एक एनालिटिक्स सिस्टम बना रहा हूं, एपीआई कॉल एक अद्वितीय उपयोगकर्ता आईडी प्रदान करेगा, लेकिन यह क्रम में और बहुत दुर्लभ नहीं है।अद्वितीय उपयोगकर्ता आईडी

मुझे प्रत्येक अद्वितीय उपयोगकर्ता आईडी को एक बिटएरे/बिटसेट में एनालिटिक्स डेटापॉइंट को चिह्नित करने के लिए एक ऑटो वृद्धि आईडी देना होगा। तो पहले उपयोगकर्ता मुठभेड़ बिटरैरे के पहले बिट के अनुरूप होंगे, दूसरा उपयोगकर्ता बिटरैरे में दूसरा बिट होगा, आदि

तो क्या मोंगोडीबी में बढ़ती अनन्य उपयोगकर्ता आईडी उत्पन्न करने का ठोस और तेज़ तरीका है?

+0

मैं आपकी तरह की एक ही समस्या को पूरा करता हूं, बिटसेट स्थिति सेट करने के लिए आईडी कैसे उत्पन्न करें। क्या आपने इस समस्या को हल किया? – brucenan

उत्तर

5

आप कर सकते हैं, लेकिन आप चाहिए नहीं http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

मोंगो में प्रत्येक वस्तु पहले से ही एक आईडी है, और वे प्रविष्टि क्रम में sortable हैं। उपयोगकर्ता ऑब्जेक्ट्स का संग्रह प्राप्त करने में क्या गलत है, इसे फिर से चालू करना और इसे बढ़ी हुई आईडी के रूप में उपयोग करना? एर नक्शा के प्रकार के लिए जाएं- पूरी तरह से नौकरी कम करें

+0

समस्या समवर्ती है। पुनरावृत्त डुप्लिकेट incremental आईडी उत्सर्जित करेगा। – est

+0

आपको केवल डेटा के लिए इस डेटा की आवश्यकता है, डेटा भंडारण नहीं। IIUC, आपको केवल अपनी सरणी के लिए अनुक्रमिक आईडी की आवश्यकता है, ताकि आप बिटसेट बना सकें। आप डेटाबेस में इस वृद्धिशील आईडी को संग्रहीत किए बिना इसे प्राप्त कर सकते हैं, और आप क्लाइंट –

+0

पर डेटा पुनर्प्राप्त किए बिना अपना बिट-सरणी बना सकते हैं, हर बार पुनरावृत्ति द्वारा incr ID प्राप्त करना काफी मूर्खतापूर्ण है, खासकर आप लाखों उपयोगकर्ताओं प्रति डेटापॉइंट से निपट रहे हैं। दांग एमएयू को 30x पुनरावृत्तियों की आवश्यकता होगी। – est

11

जैसा कि चयनित उत्तर कहता है कि आप अनुक्रमिक आईडी उत्पन्न करने के लिए findAndModify का उपयोग कर सकते हैं।

लेकिन मैं दृढ़ता से इस बात से असहमत हूं कि आपको ऐसा नहीं करना चाहिए। यह सब आपके व्यापार की जरूरतों पर निर्भर करता है। 12-बाइट आईडी होने से बहुत संसाधन उपभोग हो सकता है और भविष्य में महत्वपूर्ण स्केलेबिलिटी समस्याएं हो सकती हैं।

मेरे पास विस्तृत उत्तर here है।

+0

यदि आप चाहें तो मैं असहमत हूं, क्योंकि यह एक मोंगो इनबिल्ट फीचर है।'createIndex ({"number": 1}, {unique: true}) 'जहां कोई वृद्धि का प्रतिनिधित्व करता है और -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 रिकॉर्ड हैं। अगला आईडी 6 होना चाहिए, लेकिन आपने कुछ रिकॉर्ड हटा दिया है उदा। 3. अब आपके पास अनुक्रम 1,2,4,5 है। आपके रास्ते में अगली आईडी 5 होगी (क्योंकि गिनती = 4 + 1)। और अंतिम sequnce 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() 

आउटपुट

{ "_ id": 1, "उत्पाद": "सैमसंग", "श्रेणी": "मोबाइल"}

{ "_ id": 2 , "उत्पाद": "सैमसंग एस 3", "श्रेणी": "मोबाइल"}

3

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं भावी पीढ़ी के लिए मेरा उत्तर पोस्ट करेगा ...

यह एसवाई पर निर्भर करता है स्टेम जिसे आप बना रहे हैं और विशेष व्यवसाय नियम हैं।

मैं मोंगो डीबी, सी # (बैकएंड एपीआई), और कोणीय (फ्रंटएंड वेब ऐप) में मध्यम से बड़े पैमाने पर सीआरएम का निर्माण कर रहा हूं और ऑब्जेक्टआईड को विशेष इकाइयों का चयन करने के लिए कोणीय रूटिंग में उपयोग के लिए पूरी तरह से भयानक पाया। एपीआई नियंत्रक रूटिंग के साथ ही।

उपर्युक्त सुझाव मेरे प्रोजेक्ट के लिए पूरी तरह से काम करता है।

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

कारण यह मेरे मामले के लिए एकदम सही है, लेकिन सभी मामलों है कि ऊपर टिप्पणी राज्यों के रूप में, यदि आप संग्रह से 3 रिकॉर्ड हटाते हैं, तो टकराव हो जाएगा है।

मेरे व्यवसाय के नियम बताते हैं कि हमारे घर एसएलए के कारण, हमें पत्राचार डेटा या क्लाइंट रिकॉर्ड को उस एप्लिकेशन के संभावित जीवनकाल से अधिक समय तक हटाने की अनुमति नहीं है, और इसके लिए, मैं बस रिकॉर्ड के साथ रिकॉर्ड चिह्नित करता हूं enum "स्थिति" जो या तो "सक्रिय" या "हटाया गया" है। आप यूआई से कुछ हटा सकते हैं, और यह कहेंगे "संपर्क हटा दिया गया है" लेकिन सभी आवेदन किए गए हैं, संपर्क की स्थिति को "हटाया गया" में बदल दिया गया है और जब ऐप संपर्कों की सूची के लिए श्वसन को कॉल करता है, तो मैं फ़िल्टर करता हूं क्लाइंट ऐप में डेटा को धक्का देने से पहले हटाए गए रिकॉर्ड हटाएं।

इसलिए, db.collection.find()। गणना() + 1 मेरे लिए एक आदर्श समाधान है ...

यह हर किसी के लिए काम नहीं करेगा, लेकिन आप डेटा को नहीं हटा रहे हैं, तो यह ठीक काम करता है।

+0

क्या कोई विशेष कारण है कि मोंगोडब कहता है कि आपको अपनी आत्मा के बजाय db.xxx.find.count + 1 के रूप में फ़ंक्शन और काउंटर अनुक्रम का उपयोग करना है? हो सकता है ट्रांसकेशन प्रोसेसिंग गड़बड़ चीजें? क्या आपका समाधान वेब सर्वर पर्यावरण क्रूड में अच्छा काम करता है? आपके उत्तर – ckinfos

+0

के लिए धन्यवाद यह एक समवर्ती सेटअप में अच्छा नहीं होगा। यदि आप एक ही समय में गिनती करते हैं तो आप आसानी से उसी _id के साथ दस्तावेज़ प्राप्त कर सकते हैं। – zephos2014