أداء استعلامات Regex مع Pymongo
سؤال
أحاول إجراء استعلام Regex باستخدام Pymongo مقابل خادم MongoDB. هيكل المستندات كما يلي
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
أريد الحصول على جميع الملفات التي تتطابق مع ملف النمط *. حاولت القيام بذلك على هذا النحو
db.collectionName.find({'files':'/^File/'})
ومع ذلك ، فإنني لا أحصل على شيء ، هل أفتقد شيئًا لأنه وفقًا لمستندات MongoDB ، يجب أن يكون هذا ممكنًا. إذا قمت بإجراء الاستعلام في وحدة التحكم Mongo ، فهذا يعمل بشكل جيد ، فهل هذا يعني أن واجهة برمجة التطبيقات لا تدعمه أو أنا فقط أستخدمه بشكل غير صحيح
المحلول 2
تبين أن عمليات البحث عن Regex تتم بشكل مختلف قليلاً في Pymongo ولكنها سهلة بنفس القدر.
يتم Regex على النحو التالي:
db.collectionname.find({'files':{'$regex':'^File'}})
سيتطابق هذا
نصائح أخرى
إذا كنت ترغب في تضمين خيارات التعبير العادية (مثل تجاهل الحالة) ، فحاول:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
لتجنب التجميع المزدوج ، يمكنك استخدام غلاف BSON Regex الذي يأتي مع Pymongo:
>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})
تقوم Regex بتخزين السلسلة فقط دون محاولة تجميعها ، لذلك يمكن لـ Find_one بعد ذلك اكتشاف الوسيطة كنوع "regex" وتشكيل استعلام Mongo المناسب.
أشعر بهذه الطريقة أكثر بقليل من الإجابة الأخرى ، على سبيل المثال:
>>> db.collectionname.find({'files':{'$regex':'^File'}})
يجدر القراءة على وثائق BSON Regex إذا كنت تخطط لاستخدام استعلامات Regex لأن هناك بعض التحذيرات.
حل re
لا تستخدم الفهرس على الإطلاق. يجب عليك استخدام أوامر مثل:
db.collectionname.find({'files':{'$regex':'^File'}})
(لا يمكنني التعليق أدناه ردودهم ، لذلك أجب هنا)
import re
def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
start = '^' if starting_with else '.*'
end = '$' if ending_with else '.*'
pattern = start + re.escape(pattern) + end
return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)
الهروب من النمط قبل تجميع المقابض جميع الشخصيات.