2011-11-23 16 views
27

मैं मोंगो में एक केस असंवेदनशील खोज का उपयोग कर रहा हूं, https://stackoverflow.com/q/5500823/1028488 के समान कुछ।मोंगो में केस असंवेदनशील खोज

यानी मैं विकल्पों के साथ एक regex का उपयोग कर रहा हूँ i। अगर मैं {"SearchWord" : { '$regex' : 'win', $options: '-i' }} जैसी क्वेरी का उपयोग करें, यह पता चलता है मुझे जीत के लिए परिणाम, खिड़की & सर्दियों: लेकिन मैं मुसीबत सिर्फ इतना है कि शब्द, अपने प्रदर्शन अधिक एक 'की तरह' एसक्यूएल

में जैसे जैसे करने के लिए regex सीमित कर रहा हूँ कर रहा हूँ। मैं इसे जीतने के लिए कैसे सीमित कर सकता हूं?

मैंने /^win$/ की कोशिश की लेकिन इसका कहना है कि अवैध जेसन .... कृपया एक तरीका सुझाएं।

अग्रिम धन्यवाद

उत्तर

31

आप उपयोग कर सकते हैं '$regex':'^win$' या /^win$/i (नोटिस दूसरा एक पर कोई उद्धरण)

यहाँ स्रोत: Regex in queries with Mongo

+0

धन्यवाद ..... जो मेरे लिए काम करता है – Praneeta

17

अद्यतन: MongoDB 2.4 के रूप में एक एक का प्रयोग करेंगे ऐसा करने के लिए "टेक्स्ट" अनुक्रमणिका और पूर्ण पाठ खोज क्वेरी। आप उनके बारे में here पढ़ सकते हैं। यदि हाल ही में मोंगोडीबी का उपयोग करना है तो नीचे का दृष्टिकोण मूर्ख और अनावश्यक होगा।

हालांकि, अगर आप MongoDB < 2.4.0 है तुम इतनी तरह रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

> db.reg.insert({searchword: "win"}) 
> db.reg.insert({searchword: "window"}) 
> db.reg.insert({searchword: "Win"}) 

> db.reg.find() 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

> db.reg.find({ searchword: /^win$/i }) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

हालांकि, अपने संस्करण काम नहीं कर रहा था, क्योंकि आपने "/" रों जब की जरूरत नहीं है $ regex ऑपरेटर का उपयोग:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }}) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

उस मामले असंवेदनशील प्रश्नों सूचकांक का उपयोग नहीं करते कृपया ध्यान दें तो यह समझ बनाने के कर सकते हैं, ताकि आप उस क्वेरी को गति कर सकते हैं एक लोअरकेस searchword क्षेत्र बनाने के लिए।

RegularExpressions

+1

$ टेक्स्ट रेगेक्स के लिए प्रतिस्थापन नहीं है। यह बहुत ही सीमित है और उसे "जीत" की खोज के साथ "सर्दियों" खोजने की अनुमति नहीं दी जाएगी। –

+0

@ बीटी आप सही हैं। ऐसा करने के लिए उसे एन-ग्राम स्टोर करना होगा और उन पर मैच करना होगा। [मोंगोडीबी और पायथन के साथ अस्पष्ट खोज] (https://medium.com/xeneta/fuzzy-search-with-mongodb-and-python-57103928ee5d#.yg7f3428b) – Rohmer

+0

इसके अलावा: [केस असंवेदनशील सूचकांक] (https: // docs .mongodb.com/मैनुअल/कोर/इंडेक्स-केस-असंवेदनशील /) – Rohmer

-1

मामले असंवेदनशील db.users.find के लिए अधिक जानकारी के लिए जाओ here ({ "नाम": {$ regex: नई RegExp ("Vi", "मैं")}})

प्रकरण के लिए संवेदनशील db.users.find ({ "नाम": "Vi"}) या db.users.find ({ "ईमेल": "[email protected]"})

खोज उपयोगकर्ता तालिका में

नाम सह है शरद ऋतु का नाम और "वी" पाठ खोजा गया है

57

आप असंवेदनशील खोज के मामले में $options => i का उपयोग कर सकते हैं। स्ट्रिंग मैच के लिए आवश्यक कुछ संभावित उदाहरण देना।

सटीक केस संवेदी string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}}) 

शामिल string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}}) 

साथ प्रारंभ string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}}) 

समाप्ति string

साथ 210
db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}}) 

नहीं शामिल करता है string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}}) 

बुकमार्क के रूप में रखें, और किसी अन्य छेड़छाड़ आप की आवश्यकता हो सकती के लिए एक संदर्भ। http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

गलती से, आपने "सटीक केस असंवेदनशील स्ट्रिंग" के अंदर "स्ट्रिंग शामिल है" का उदाहरण दिया था और इसके विपरीत। मैंने उन दो मामलों के उदाहरणों को स्वैप करके अपना जवाब संपादित किया है और कुछ व्याकरण संबंधी गलतियों को भी सही किया है। – gauravparmar

+0

@ गौरावपर: कृपया कुछ भी गलत होने पर जांचें और सही करें। –

+0

मैंने आपके उत्तर को संपादित किया है लेकिन इसे सहकर्मी-समीक्षा की जानी चाहिए, यह कहता है। – gauravparmar

0

$ strcasecmp का उपयोग करें। मोंगोडीबी 2.2 में एकत्रीकरण ढांचा पेश किया गया था। तारों के बीच केस-असंवेदनशील तुलना करने के लिए आप स्ट्रिंग ऑपरेटर "$ strcasecmp" का उपयोग कर सकते हैं। रेगेक्स का उपयोग करने की तुलना में यह अधिक अनुशंसित और आसान है।

यहां एग्रीगेशन कमांड ऑपरेटर पर आधिकारिक दस्तावेज़ है: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp

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