سؤال

أحاول إجراء استعلام 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)

الهروب من النمط قبل تجميع المقابض جميع الشخصيات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top