MongoDB التعبير النمطي ($regex) مع أمثلة

⚡ ملخص ذكي

MongoDB تقوم التعبيرات النمطية بمطابقة الأنماط للعثور على السلاسل النصية داخل المستندات، باستخدام عامل التشغيل $regex، وعلامة $options لعدم حساسية حالة الأحرف، وعلامات التثبيت للمطابقات التامة، وعلامات الشرطة المائلة عندما تكون قيمة الحقل الدقيقة غير معروفة.

  • 🔍 $ regex Operaتور: db.collection.find({field:{$regex:”pattern”}}) يطابق المستندات التي تحتوي على النمط.
  • 🎯 Anchors: ^ و $ يفرضان مطابقة تامة، ويربطان النمط ببداية ونهاية السلسلة.
  • 🔠 عدم مراعاة حالة الأحرف: يطابق الخيار 'i' في $options النص بغض النظر عن كونه بأحرف كبيرة أو صغيرة.
  • علامات التحديد المائلة: التفافping نمط في /…/ يتطابق بدون كتابة عامل التشغيل $regex.
  • 📉 آخر N وثيقة: قم بدمج sort({_id:-1}) مع limit(n) لإرجاع أحدث السجلات.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم المساعدون بإنشاء أنماط التعبيرات النمطية وتحديد تكاليف أداء المسح الكامل للمجموعة.

MongoDB التعبيرات العادية (Regex)

تُستخدم التعابير النمطية لمطابقة الأنماط، والتي تُستخدم أساسًا للعثور على السلاسل النصية داخل المستندات.

في بعض الأحيان، عند استرداد المستندات في مجموعة، قد لا تعرف بالضبط ما هي قيمة الحقل المحددة التي يجب البحث عنها. وبالتالي، يمكن للمرء استخدام التعبيرات العادية للمساعدة في استرجاع البيانات بناءً على قيم البحث المطابقة للنمط.

استخدام عامل $regex لمطابقة الأنماط

عامل $regex في MongoDB يتم استخدامه للبحث عن سلاسل محددة في المجموعة. يوضح المثال التالي كيفية القيام بذلك.

لنفترض أن لدينا نفس مجموعة بيانات الموظفين التي تحتوي على حقلين باسمي "Employeeid" و"EmployeeName". ولنفترض أيضًا أن لدينا المستندات التالية في مجموعتنا.

هوية الموظف اسم الموظف
22 نيومارتن
2 موهان
3 جو
4 موهان ر
100 Guru99
6 جورانج

في الكود أدناه، استخدمنا عامل التشغيل $regex لتحديد معايير البحث.

باستخدام $ regex Operaتور لمطابقة الأنماط

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code التفسير:

  1. نريد هنا العثور على جميع أسماء الموظفين التي تحتوي على الأحرف 'Gu'. لذا، نحدد عامل $regex لتحديد معايير البحث عن 'Gu'.
  2. يتم استخدام printjson لطباعة كل مستند يتم إرجاعه بواسطة الاستعلام بطريقة أفضل.

إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:

الإخراج:

باستخدام $ regex Operaتور لمطابقة الأنماط

يُظهر الإخراج بوضوح أنه تم إرجاع تلك المستندات التي يحتوي فيها اسم الموظف على أحرف "Gu".

لنفترض أن مجموعتك تحتوي على المستندات التالية بالإضافة إلى مستند إضافي يحتوي على اسم الموظف كالتالي: "Guru999". إذا أدخلت معايير البحث على النحو التالي:Guru99"، كما أنه سيعيد المستند الذي يحتوي على "Guru999". ولكن لنفترض أننا لا نريد هذا ونريد فقط إعادة المستند مع "Guru٩٩". بعد ذلك، يمكننا القيام بذلك باستخدام مطابقة الأنماط الدقيقة. لإجراء مطابقة أنماط دقيقة، سنستخدم الرمزين ^ و$. سنضيف الرمز ^ في بداية السلسلة والرمز $ في نهايتها.

هوية الموظف اسم الموظف
22 نيومارتن
2 موهان
3 جو
4 موهان ر
100 Guru99
6 جورانج
8 Guru999

يوضح المثال التالي كيفية القيام بذلك.

باستخدام $ regex Operaتور لمطابقة الأنماط

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code التفسير:

  1. هنا في معايير البحث، نستخدم الرمزين ^ و$. يُستخدم الرمز ^ للتأكد من أن السلسلة تبدأ بحرف معين، ويُستخدم الرمز $ للتأكد من أن السلسلة تنتهي بحرف معين. لذا، عند تنفيذ الكود، سيجلب فقط السلسلة التي تحمل الاسم "Guru99 ".
  2. يتم استخدام printjson لطباعة كل مستند يتم إرجاعه بواسطة الاستعلام بطريقة أفضل.

إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:

الإخراج:

باستخدام $ regex Operaتور لمطابقة الأنماط

يظهر بوضوح في المخرجات أن السلسلة "Guruتم جلب 99 بوصة.

مطابقة الأنماط مع $options

عند استخدام عامل التشغيل $regex، يمكن أيضًا توفير خيارات إضافية باستخدام خيارات $ الكلمة الرئيسية. على سبيل المثال، لنفترض أنك تريد العثور على جميع المستندات التي تحتوي على كلمة "Gu" في اسم الموظف، بغض النظر عما إذا كانت حساسة لحالة الأحرف أو غير حساسة. إذا كانت هذه النتيجة مرغوبة، فإننا بحاجة إلى استخدام خيارات $ مع مراعاة عدم حساسية حالة الأحرف.

يوضح المثال التالي كيفية القيام بذلك.

لنفترض أن لدينا نفس مجموعة الموظفين التي تحتوي على أسماء الحقول "Employeeid" و "EmployeeName".

لنفترض أيضاً أن لدينا المستندات التالية في مجموعتنا.

هوية الموظف اسم الموظف
22 نيومارتن
2 موهان
3 جو
4 موهان ر
100 Guru99
6 جورانج
7 جورو 99

إذا نفذنا نفس الاستعلام المذكور في الموضوع السابق، فلن نرى المستند الذي يحتوي على "GURU99" في النتائج. ولضمان ظهوره في مجموعة النتائج، نحتاج إلى إضافة المعامل "i" في خيارات $options.

مطابقة الأنماط مع $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code التفسير:

  1. تحدد الخيارات $options مع المعامل 'i' (والذي يعني عدم حساسية حالة الأحرف) أننا نريد إجراء البحث بغض النظر عما إذا كنا سنجد الأحرف 'Gu' بأحرف صغيرة أو كبيرة.

إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:

الإخراج:

مطابقة الأنماط مع $options

  1. يُظهر الناتج بوضوح أنه على الرغم من أن أحد المستندات يحتوي على الحرف الكبير 'Gu'، إلا أن المستند لا يزال يظهر في مجموعة النتائج.

مطابقة الأنماط بدون عامل التعبيرات العادية

يمكن أيضًا إجراء مطابقة الأنماط دون استخدام عامل $regex. يوضح المثال التالي كيفية القيام بذلك.

مطابقة الأنماط بدون Regex Operaتور

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code التفسير:

  1. تُستخدم علامات "//" لتحديد معايير البحث ضمن هذه العلامات. لذا، نستخدم /Gu/ للعثور على المستندات التي تحتوي على "Gu" في اسم الموظف.

إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:

الإخراج:

مطابقة الأنماط بدون Regex Operaتور

يُظهر الإخراج بوضوح أنه تم إرجاع تلك المستندات التي يحتوي فيها اسم الموظف على أحرف "Gu".

جلب المستندات الأخيرة من المجموعة

هناك طرق مختلفة للحصول على آخر عدد من المستندات في المجموعة.

دعونا نلقي نظرة على إحدى الطرق من خلال الخطوات التالية.

يوضح المثال التالي كيفية القيام بذلك.

لنفترض أن لدينا نفس مجموعة الموظفين التي تحتوي على أسماء الحقول "Employeeid" و "EmployeeName".

لنفترض أيضاً أن لدينا المستندات التالية في مجموعتنا:

هوية الموظف اسم الموظف
22 نيومارتن
2 موهان
3 جو
4 موهان ر
100 Guru99
6 جورانج
7 جورو 99

جلب آخر n مستند من مجموعة

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code التفسير:

  1. عند الاستعلام عن المستندات، استخدم دالة الفرز لترتيب السجلات بترتيب عكسي بناءً على قيمة حقل _id في المجموعة. يشير الرقم -1 إلى ترتيب المستندات بترتيب عكسي أو تنازلي بحيث يصبح المستند الأخير هو أول مستند يتم عرضه.
  2. ثم استخدم عبارة الحد لعرض عدد السجلات التي تريدها فقط. هنا قمنا بتعيين عبارة الحد (2)، لذا سيتم جلب آخر مستندين.

إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:

الإخراج:

جلب آخر n مستند من مجموعة

يُظهر الناتج بوضوح أنه يتم عرض آخر مستندين في المجموعة. وبالتالي، أظهرنا بوضوح أنه لجلب آخر 'n' مستند في المجموعة، يمكننا أولاً فرز المستندات بترتيب تنازلي ثم استخدام شرط الحد لإرجاع عدد 'n' من المستندات المطلوبة.

ملاحظات: إذا تم إجراء البحث على سلسلة أكبر من 38,000 حرفًا، فلن يتم عرض النتائج الصحيحة.

الأسئلة الشائعة

Anchor النمط الذي يحتوي على ^ و $. النمط “^Guru"99$" يطابق فقط "Guru99" ويرفض "Guru999"، لأن ^ يربط بداية السلسلة و $ يربط النهاية.

لا تستخدم الفهرس بكفاءة إلا الأنماط الحساسة لحالة الأحرف التي تبدأ بالرمز ^. أما الأنماط غير المثبتة أو غير الحساسة لحالة الأحرف فتؤدي إلى مسح كامل للمجموعة، لذا يُنصح بتثبيت البادئة كلما أمكن ذلك.

ضع شرطة مائلة عكسية قبل الأحرف الخاصة مثل النقطة والنجمة والزائد والأقواس. على سبيل المثال، نمط نهاية ".com" الحرفي يتجاهل النقطة حتى لا تُعامل كأي حرف آخر.

تُجري الدالة $regex مطابقة أنماط مرنة على حقل واحد، ويمكنها مسح المجموعة بأكملها. أما الدالة $text فتستخدم فهرسًا نصيًا للبحث السريع عن الكلمات في الحقول المفهرسة، لكنها لا تدعم أنماط السلاسل الفرعية الجزئية.

نعم. عندما يتجاوز طول سلسلة البحث حوالي 38,000 حرف، قد لا تُظهر الاستعلامات نتائج صحيحة. لذا، يُنصح بالحفاظ على الأنماط والحقول المستهدفة ضمن هذا الحد لضمان مطابقة موثوقة.

قم بتخزين نسخة بأحرف صغيرة من الحقل لعمليات البحث غير الحساسة لحالة الأحرف، وقم بتثبيت الأنماط باستخدام ^، وفضل استخدام فهرس نصي أو بحث أطلس على المجموعات الكبيرة بدلاً من $regex غير المثبتة.

تقوم المساعدات المدعومة بالذكاء الاصطناعي بتحويل قواعد اللغة الإنجليزية البسيطة إلى أنماط $regex، وإضافة نقاط الارتكاز الصحيحة وعلامة $options، والتحذير عندما يؤدي الاستعلام إلى تشغيل فحص كامل بطيء للمجموعة.

نعم. يقوم مساعد الذكاء الاصطناعي بإعادة كتابة الأنماط غير المثبتة، ويوصي بفهرس نصي أو بحث أطلس، ويحول التعبير النمطي غير الحساس لحالة الأحرف إلى بحث حقل بأحرف صغيرة من أجل السرعة.

تلخيص هذه التدوينة بـ: