हे, मैं हाल ही में एक ही चीज़ चाहता था।
जो मैंने समाप्त कर दिया है वह प्रत्येक दस्तावेज़ को दे रहा है जिसके लिए एक "सार्वजनिक आईडी" अद्वितीय है (ऑब्जेक्टआईडी की तरह), लेकिन यह केवल एक ऑटो-वृद्धिशील संख्या है (इसलिए इसमें कुछ समय पहले लगेगा संख्याएं बड़ी हो जाती हैं, और यदि वे हेक्स-एनकोडेड हैं तो भी लंबे समय तक)। इस तरह, मैं ऑब्जेक्टआईडी का आंतरिक रूप से उपयोग कर सकता हूं (जो मुझे संदेह है), और बाहरी सार्वजनिक रूप से संदर्भित दस्तावेजों को उनके सार्वजनिक आईडी का उपयोग कर संदर्भित किया गया है।
ध्यान दें कि इन सार्वजनिक आईडी बनाने के दौरान थोड़ा प्रदर्शन किया जाता है क्योंकि प्रत्येक को किसी दस्तावेज़ पर परमाणु अद्यतन की आवश्यकता होती है (इसलिए आपको केवल उनको उपयोग करना चाहिए जहां आपको उनकी आवश्यकता है)।
एक ऑटो-इंक्रिमेंटिंग नंबर बनाने की कुंजी मोंगोडीबी के findAndModify
command दोनों को मूल्य बढ़ाने और एकल परमाणु ऑपरेशन में पुराने मान को वापस करने के लिए है।
आप अजगर का उपयोग कर रहे हैं, और इसलिए मैं कर रहा हूँ, यहाँ कोड है कि मैं वर्तमान में उपयोग कर रहा हूँ (ध्यान दें कि यह अभी तक उत्पादन में नहीं है) है के बाद से:
from pymongo import Connection
from pymongo.son import SON
db = Connection().mydatabase
PUBLIC_ID_COLLECTION = 'next_public_id'
def next_public_id():
result = db.command(SON({ 'findandmodify': PUBLIC_ID_COLLECTION },
query = { '_id': 'manager' },
update = { '$inc': { 'next_public_id': 1 } },
upsert = True # Insert if not already existing
))
manager = result['value']
return manager.get('next_public_id', 0)
आप कैसे डीकोड करते हैं? साथ ही, संसाधन को देखते समय, क्या यह डीकोड करने के लिए तेज़ होता है और फिर _id द्वारा देखता है या बस बेस 62 एन्कोडेड फ़ील्ड में एक इंडेक्स जोड़ता है? – user1071182
मैं नोड बेस 62 पैकेज का उपयोग कर रहा हूं https://npmjs.org/package/base62 ध्यान दें कि डीकोड ठीक से काम नहीं करता है> आईडी '513fce0fcaa8ed9819000002' > enc = base62.encode (parseInt (id, 16)) ' wHzaphe07ek80CC8 ' > base62.decode (enc) .toString (16) ' 513fce0fcaa8ec0000000000 – user1071182
जावास्क्रिप्ट के लिए संख्या बहुत बड़ी है। मैं बेस 58 एन्कोडिंग का उपयोग कर समाप्त हुआ और संख्या को आधे में बांट रहा हूं और यह ठीक से काम करता है। > एएनसीसी = बेस 58.encode (parseInt (id.substring (0,12), 16)); 'जीएसईएएफटीएस 9' > benc = base58.encode (parseInt (id।सबस्ट्रिंग (12,24), 16)); '33jgsdqRG' > बेस 58.decode (एएनसीसी) .toString (16) + Base58.decode (benc) .toString (16); '513fce0fcaa8ed9819000002' सूचकांक बनाम डीकोडिंग – user1071182