2010-11-23 3 views
13

मैंने कई पाइथन संचालित साइटों का निर्माण किया है जो मैंगोडब को डेटाबेस बैकएंड के रूप में उपयोग करते हैं और ऑब्जेक्टआईड सिस्टम से बहुत खुश हैं, हालांकि, मै मैपिंग संग्रह के बिना एक छोटे से फैशन में आईडी को एन्कोड करने में सक्षम होना पसंद करूंगा या एक यूआरएल-शॉर्टनर सेवा का उपयोग करना।URL में बेहतर उपयोग के लिए एक मोन्गो आईडी कैसे छोटा कर सकता है?

सुझाव? सफलता की कहानियां?

उत्तर

7

हे, मैं हाल ही में एक ही चीज़ चाहता था।

जो मैंने समाप्त कर दिया है वह प्रत्येक दस्तावेज़ को दे रहा है जिसके लिए एक "सार्वजनिक आईडी" अद्वितीय है (ऑब्जेक्टआईडी की तरह), लेकिन यह केवल एक ऑटो-वृद्धिशील संख्या है (इसलिए इसमें कुछ समय पहले लगेगा संख्याएं बड़ी हो जाती हैं, और यदि वे हेक्स-एनकोडेड हैं तो भी लंबे समय तक)। इस तरह, मैं ऑब्जेक्टआईडी का आंतरिक रूप से उपयोग कर सकता हूं (जो मुझे संदेह है), और बाहरी सार्वजनिक रूप से संदर्भित दस्तावेजों को उनके सार्वजनिक आईडी का उपयोग कर संदर्भित किया गया है।

ध्यान दें कि इन सार्वजनिक आईडी बनाने के दौरान थोड़ा प्रदर्शन किया जाता है क्योंकि प्रत्येक को किसी दस्तावेज़ पर परमाणु अद्यतन की आवश्यकता होती है (इसलिए आपको केवल उनको उपयोग करना चाहिए जहां आपको उनकी आवश्यकता है)।

एक ऑटो-इंक्रिमेंटिंग नंबर बनाने की कुंजी मोंगोडीबी के 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) 
12

आप उन्हें Base62 संख्या के रूप में सेक सकता है । यह बहुत सी जगह नहीं बचाता है, लेकिन यह आपको प्रति आईडी कुछ बाइट्स बचाता है। मेरा उदाहरण रूबी है, लेकिन पाइथन में समान उपयोग कठिन नहीं होगा।

ree-1.8.7-2010.02 > User.first._id.to_s 
=> "4c76f3dd98db74697500003b" 

ree-1.8.7-2010.02 > User.first._id.to_s.to_i(16).base62_encode 
=> "uMarF7LmpY3bNOSn" 
+0

आप कैसे डीकोड करते हैं? साथ ही, संसाधन को देखते समय, क्या यह डीकोड करने के लिए तेज़ होता है और फिर _id द्वारा देखता है या बस बेस 62 एन्कोडेड फ़ील्ड में एक इंडेक्स जोड़ता है? – user1071182

+0

मैं नोड बेस 62 पैकेज का उपयोग कर रहा हूं https://npmjs.org/package/base62 ध्यान दें कि डीकोड ठीक से काम नहीं करता है> आईडी '513fce0fcaa8ed9819000002' > enc = base62.encode (parseInt (id, 16)) ' wHzaphe07ek80CC8 ' > base62.decode (enc) .toString (16) ' 513fce0fcaa8ec0000000000 – user1071182

+0

जावास्क्रिप्ट के लिए संख्या बहुत बड़ी है। मैं बेस 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

1

यदि आप मूल मूल्य को बनाए रखने का प्रयास कर रहे हैं तो वास्तव में कोई अच्छा तरीका नहीं है। आप इसे एन्कोड कर सकते हैं, लेकिन इसकी छोटीता कम होने की संभावना कम है। आप इसे हश कर सकते हैं, लेकिन फिर यह उलटा नहीं है।

यदि यह एक आवश्यकता है, तो शायद मैं एक लुकअप टेबल या संग्रह बनाने की अनुशंसा करता हूं जहां एक मोंगो संग्रह में एक छोटी वृद्धिशील संख्या संदर्भ प्रविष्टियां हों।

1

मैंने इस विषय को कुछ समय पहले मोंगोडब की मेलिंग सूची पर लाया था। देखें कि क्या यह आपकी मदद कर सकता है।

Custom _id

0

आप ऑटो-incrementing अद्वितीय नंबर जेनरेट कर सकते हैं, वहाँ बिल्कुल _ id के लिए ObjectId उपयोग करने की आवश्यकता है। वितरित वातावरण में ऐसा करने से ऑब्जेक्टआईडी का उपयोग करने की तुलना में अधिक महंगा होगा। यह आपका ट्रेडऑफ है।

संबंधित मुद्दे