2011-06-07 14 views
18

मामले में मोंगोडीबी (पिमोंगो के माध्यम से) पूछताछ में मैं वर्तमान में पायथन (पिरामिड) में एक वेबसाइट बना रहा हूं जिसके लिए उपयोगकर्ताओं को साइन अप करने और लॉग इन करने की आवश्यकता है। सिस्टम उपयोगकर्ताओं को उपयोगकर्ता नाम चुनने की अनुमति देता है जो कि मिश्रण हो सकता है पूंजी अक्षरों, लोअरकेस अक्षरों, और संख्याओं।असंगत कुशलतापूर्वक

समस्या यह सुनिश्चित करते समय उत्पन्न होती है कि दो उपयोगकर्ता गलती से एक ही उपयोगकर्ता नाम साझा नहीं करते हैं, यानी मेरे सिस्टम 'randomUser' में 'RandomUser' या 'randomuser' जैसा ही होना चाहिए।

दुर्भाग्यवश (इस मामले में) क्योंकि मोंगो तारों को केस संवेदनशील के रूप में स्टोर करता है, संभावित रूप से 'समान' उपयोगकर्ता नाम वाले कई उपयोगकर्ता हो सकते हैं।

मैं केस संवेदी स्ट्रिंग्स के लिए मोंगो क्वेरी करने की विधि के बारे में पता कर रहा हूँ:

db.stuff.find_one({"foo": /bar/i}); 

हालांकि, इस pymongo का उपयोग कर अपनी क्वेरी विधि में काम करने के लिए प्रतीत नहीं होता:

username = '/' + str(username) + '/i' 
response = request.db['user'].find_one({"username":username},{"username":1}) 

है इस pymongo के लिए क्वेरी संरचना का सही तरीका (मैं नहीं मान रहा हूँ)?

यह क्वेरी तब भी उपयोग की जाएगी जब कोई उपयोगकर्ता खाता बनाया या लॉग इन किया गया हो (जैसा कि यह जांचना है कि उपयोगकर्ता नाम में उपयोगकर्ता नाम मौजूद है या नहीं)। मुझे पता है कि यह सबसे कुशल क्वेरी नहीं है, इसलिए इससे कोई फर्क नहीं पड़ता कि यह केवल लॉग इन या खाता निर्माण पर उपयोग किया जाता है? क्या यह उपयोगकर्ताओं को केवल लोअरकेस उपयोगकर्ता नाम चुनने के लिए मजबूर करना है (केस-असंवेदनशील प्रश्नों की आवश्यकता को पूरी तरह से अस्वीकार करना)?

+0

ध्यान रखें कि यह एक पूर्ण तालिका स्कैन की आवश्यकता है - अनुक्रमित नियमित अभिव्यक्ति के साथ नहीं किया जा सकता जब तक कि वे केस संवेदी होते हैं और रेगुलर एक्सप्रेशन "पंक्ति के आरंभ के सापेक्ष है, '^' "। – mnemosyn

+0

मुझे लगता है कि आपका मतलब है "जब तक वे केस संवेदनशील नहीं होते हैं" – dcrosta

उत्तर

34

पायमोंगो देशी पायथन नियमित अभिव्यक्तियों का उपयोग करता है, वैसे ही जैसे मोंगो खोल मूल जावास्क्रिप्ट नियमित अभिव्यक्तियों का उपयोग करता है। क्या आप खोल में ऊपर लिखा था के बराबर क्वेरी लिखने के लिए, आप का प्रयोग करेंगे:

db.stuff.find_one({'name': re.compile(username, re.IGNORECASE)}) 

ध्यान दें कि यह किसी भी सूचकांक कि name मैदान पर मौजूद हो सकता है का उपयोग कर से बचने जाएगा हालांकि,। केस-असंवेदनशील खोज या सॉर्टिंग के लिए एक सामान्य पैटर्न आपके दस्तावेज़ में दूसरा फ़ील्ड होना है, उदाहरण के लिए name_lower, जो हमेशा name परिवर्तन (इस मामले में name के निचले-संस्करण वाले संस्करण में) सेट होता है। तो आप की तरह इस तरह के एक दस्तावेज के लिए क्वेरी होगा:

db.stuff.find_one({'name_lower': username.lower()}) 
+0

आह, मेरे लिए इसे साफ़ करने के लिए धन्यवाद। मैं name_lower विधि का उपयोग करूंगा (यह अन्य स्थानों में भी उल्लेख किया गया है) – johneth

+2

क्या यह समस्या नहीं होगी यदि "उपयोगकर्ता नाम" चर में नियमित अभिव्यक्ति मेटाएक्टैक्टर्स शामिल हैं? – MarioVilas

+9

एक सुरक्षित क्वेरी होगी: 'db.stuff.find_one ({name ': re.compile ('^'+ re.escape (उपयोगकर्ता नाम) +' $ ', re.IGNORECASE)})' – djsmith

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