पाइमेन्गो के साथ रेगेक्स क्वेरी का प्रदर्शन


129

मैं एक mongodb सर्वर के खिलाफ pymongo का उपयोग करके एक रेगेक्स क्वेरी करने की कोशिश कर रहा हूं। दस्तावेज़ संरचना इस प्रकार है

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

मैं उन सभी फ़ाइलों को प्राप्त करना चाहता हूं जो पैटर्न * फ़ाइल से मेल खाती हैं। मैंने ऐसा करने की कोशिश की

db.collectionName.find({'files':'/^File/'})

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

जवाबों:


191

यदि आप नियमित अभिव्यक्ति विकल्प (जैसे कि मामले को अनदेखा करना) शामिल करना चाहते हैं, तो यह प्रयास करें:

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})

8
यह भी ध्यान दें कि regex की शुरुआत में लंगर (यानी: के साथ शुरू ^) db में अनुक्रमित का उपयोग करने में सक्षम है, और उस मामले में बहुत तेजी से चलेगा।
drevicko

1
रेगेक्स की ^ के साथ शुरुआत केवल कुछ मामलों में सूचकांक का उपयोग कर सकती है । जब मैं पुनर्मिलन का उपयोग कर रहा हूं तो मेरा मानना ​​है कि मूंग क्वेरी का प्रदर्शन करने के लिए एक सूचकांक का उपयोग नहीं कर सकता है।
नॉनगॉन

क्या यह उपयोग कहीं दस्तावेज है? मुझे यह आधिकारिक pymongo API डॉक में नहीं मिला।
हियु

153

रेगेक्स खोजों को टर्न आउट किया जाता है जो कि पाइमोन्गो में थोड़े अलग तरीके से किया जाता है लेकिन यह उतना ही आसान है।

रेगेक्स निम्नानुसार किया जाता है:

db.collectionname.find({'files':{'$regex':'^File'}})

यह उन सभी दस्तावेज़ों से मेल खाएगा जिनके पास एक फ़ाइल संपत्ति है जिसमें एक आइटम है जो फ़ाइल से शुरू होता है


9
वास्तव में, आपके पास यहां क्या है यह भी जावास्क्रिप्ट (और शायद अन्य भाषाओं में भी) का उपयोग करने का तरीका है$regex । @ एरिक का जवाब अजगर तरीका है जो थोड़ा अलग है।
drevicko

क्या फर्क पड़ता है? वे दोनों अजगर pymongo सही का उपयोग कर रहे हैं? यह मोनगोडब प्रश्नों का हिस्सा है, इसलिए मुझे वास्तव में समस्या दिखाई नहीं देती है।
Dexter

10
मोंगोडेब जेस्क्रिप्ट के रेज में भी इग्नोरेसिस संभव है। db.collectionname.find ({'files': {'$ regex': '^ फ़ाइल', '$ विकल्प': 'i'}})
अजय गुप्ता

5
यह जवाब मेरी आंखों को बेहतर लगता है। एक पायथन आरई को संकलित करने में परेशान क्यों करें यदि आप इसे कड़े करने जा रहे हैं ताकि मानगो इसे फिर से संकलित कर सके? मोंगो का $regexऑपरेटर एक $optionsतर्क लेता है।
मार्क ई। हासे

3
कृपया अन्य समस्या से बचने r'^File'के '^File'लिए उपयोग करें
अमीना नुरैनी

9

दोहरे संकलन से बचने के लिए आप बोम रेगेक्स रैपर का उपयोग कर सकते हैं जो PyMongo के साथ आता है:

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

रेगेक्स केवल इसे संकलित करने की कोशिश किए बिना स्ट्रिंग को संग्रहीत करता है, इसलिए find_one तब तर्क को 'रेगेक्स' प्रकार का पता लगा सकता है और उपयुक्त मैंगो क्वेरी बना सकता है।

मुझे लगता है कि यह अन्य शीर्ष उत्तर की तुलना में थोड़ा अधिक पायथन है, जैसे:

>>> db.collectionname.find({'files':{'$regex':'^File'}})

यदि आप regex क्वेरी का उपयोग करने की योजना बना रहे हैं तो यह बैज रेगेक्स डॉक्यूमेंटेशन पर पढ़ने लायक है क्योंकि इसमें कुछ प्रश्न हैं।


1
यदि आपको फिर से एक सरणी का उपयोग करने की आवश्यकता है तो $ regex आपके लिए काम नहीं करेगा। bson.regex.Regex चाल चलेगा!
ओडफॉस

4

इसका समाधान reसूचकांक का उपयोग बिल्कुल नहीं करता है। आपको कमांड का उपयोग करना चाहिए:

db.collectionname.find({'files':{'$regex':'^File'}})

(मैं उनके उत्तरों के नीचे टिप्पणी नहीं कर सकता, इसलिए मैं यहां उत्तर देता हूं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.