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

تُستخدم التعابير النمطية لمطابقة الأنماط، والتي تُستخدم أساسًا للعثور على السلاسل النصية داخل المستندات.
في بعض الأحيان، عند استرداد المستندات في مجموعة، قد لا تعرف بالضبط ما هي قيمة الحقل المحددة التي يجب البحث عنها. وبالتالي، يمكن للمرء استخدام التعبيرات العادية للمساعدة في استرجاع البيانات بناءً على قيم البحث المطابقة للنمط.
استخدام عامل $regex لمطابقة الأنماط
عامل $regex في MongoDB يتم استخدامه للبحث عن سلاسل محددة في المجموعة. يوضح المثال التالي كيفية القيام بذلك.
لنفترض أن لدينا نفس مجموعة بيانات الموظفين التي تحتوي على حقلين باسمي "Employeeid" و"EmployeeName". ولنفترض أيضًا أن لدينا المستندات التالية في مجموعتنا.
| هوية الموظف | اسم الموظف |
|---|---|
| 22 | نيومارتن |
| 2 | موهان |
| 3 | جو |
| 4 | موهان ر |
| 100 | Guru99 |
| 6 | جورانج |
في الكود أدناه، استخدمنا عامل التشغيل $regex لتحديد معايير البحث.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code التفسير:
- نريد هنا العثور على جميع أسماء الموظفين التي تحتوي على الأحرف 'Gu'. لذا، نحدد عامل $regex لتحديد معايير البحث عن 'Gu'.
- يتم استخدام printjson لطباعة كل مستند يتم إرجاعه بواسطة الاستعلام بطريقة أفضل.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:
الإخراج:
يُظهر الإخراج بوضوح أنه تم إرجاع تلك المستندات التي يحتوي فيها اسم الموظف على أحرف "Gu".
لنفترض أن مجموعتك تحتوي على المستندات التالية بالإضافة إلى مستند إضافي يحتوي على اسم الموظف كالتالي: "Guru999". إذا أدخلت معايير البحث على النحو التالي:Guru99"، كما أنه سيعيد المستند الذي يحتوي على "Guru999". ولكن لنفترض أننا لا نريد هذا ونريد فقط إعادة المستند مع "Guru٩٩". بعد ذلك، يمكننا القيام بذلك باستخدام مطابقة الأنماط الدقيقة. لإجراء مطابقة أنماط دقيقة، سنستخدم الرمزين ^ و$. سنضيف الرمز ^ في بداية السلسلة والرمز $ في نهايتها.
| هوية الموظف | اسم الموظف |
|---|---|
| 22 | نيومارتن |
| 2 | موهان |
| 3 | جو |
| 4 | موهان ر |
| 100 | Guru99 |
| 6 | جورانج |
| 8 | Guru999 |
يوضح المثال التالي كيفية القيام بذلك.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code التفسير:
- هنا في معايير البحث، نستخدم الرمزين ^ و$. يُستخدم الرمز ^ للتأكد من أن السلسلة تبدأ بحرف معين، ويُستخدم الرمز $ للتأكد من أن السلسلة تنتهي بحرف معين. لذا، عند تنفيذ الكود، سيجلب فقط السلسلة التي تحمل الاسم "Guru99 ".
- يتم استخدام printjson لطباعة كل مستند يتم إرجاعه بواسطة الاستعلام بطريقة أفضل.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:
الإخراج:
يظهر بوضوح في المخرجات أن السلسلة "Guruتم جلب 99 بوصة.
مطابقة الأنماط مع $options
عند استخدام عامل التشغيل $regex، يمكن أيضًا توفير خيارات إضافية باستخدام خيارات $ الكلمة الرئيسية. على سبيل المثال، لنفترض أنك تريد العثور على جميع المستندات التي تحتوي على كلمة "Gu" في اسم الموظف، بغض النظر عما إذا كانت حساسة لحالة الأحرف أو غير حساسة. إذا كانت هذه النتيجة مرغوبة، فإننا بحاجة إلى استخدام خيارات $ مع مراعاة عدم حساسية حالة الأحرف.
يوضح المثال التالي كيفية القيام بذلك.
لنفترض أن لدينا نفس مجموعة الموظفين التي تحتوي على أسماء الحقول "Employeeid" و "EmployeeName".
لنفترض أيضاً أن لدينا المستندات التالية في مجموعتنا.
| هوية الموظف | اسم الموظف |
|---|---|
| 22 | نيومارتن |
| 2 | موهان |
| 3 | جو |
| 4 | موهان ر |
| 100 | Guru99 |
| 6 | جورانج |
| 7 | جورو 99 |
إذا نفذنا نفس الاستعلام المذكور في الموضوع السابق، فلن نرى المستند الذي يحتوي على "GURU99" في النتائج. ولضمان ظهوره في مجموعة النتائج، نحتاج إلى إضافة المعامل "i" في خيارات $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code التفسير:
- تحدد الخيارات $options مع المعامل 'i' (والذي يعني عدم حساسية حالة الأحرف) أننا نريد إجراء البحث بغض النظر عما إذا كنا سنجد الأحرف 'Gu' بأحرف صغيرة أو كبيرة.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:
الإخراج:
- يُظهر الناتج بوضوح أنه على الرغم من أن أحد المستندات يحتوي على الحرف الكبير 'Gu'، إلا أن المستند لا يزال يظهر في مجموعة النتائج.
مطابقة الأنماط بدون عامل التعبيرات العادية
يمكن أيضًا إجراء مطابقة الأنماط دون استخدام عامل $regex. يوضح المثال التالي كيفية القيام بذلك.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code التفسير:
- تُستخدم علامات "//" لتحديد معايير البحث ضمن هذه العلامات. لذا، نستخدم /Gu/ للعثور على المستندات التي تحتوي على "Gu" في اسم الموظف.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:
الإخراج:
يُظهر الإخراج بوضوح أنه تم إرجاع تلك المستندات التي يحتوي فيها اسم الموظف على أحرف "Gu".
جلب المستندات الأخيرة من المجموعة
هناك طرق مختلفة للحصول على آخر عدد من المستندات في المجموعة.
دعونا نلقي نظرة على إحدى الطرق من خلال الخطوات التالية.
يوضح المثال التالي كيفية القيام بذلك.
لنفترض أن لدينا نفس مجموعة الموظفين التي تحتوي على أسماء الحقول "Employeeid" و "EmployeeName".
لنفترض أيضاً أن لدينا المستندات التالية في مجموعتنا:
| هوية الموظف | اسم الموظف |
|---|---|
| 22 | نيومارتن |
| 2 | موهان |
| 3 | جو |
| 4 | موهان ر |
| 100 | Guru99 |
| 6 | جورانج |
| 7 | جورو 99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code التفسير:
- عند الاستعلام عن المستندات، استخدم دالة الفرز لترتيب السجلات بترتيب عكسي بناءً على قيمة حقل _id في المجموعة. يشير الرقم -1 إلى ترتيب المستندات بترتيب عكسي أو تنازلي بحيث يصبح المستند الأخير هو أول مستند يتم عرضه.
- ثم استخدم عبارة الحد لعرض عدد السجلات التي تريدها فقط. هنا قمنا بتعيين عبارة الحد (2)، لذا سيتم جلب آخر مستندين.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الإخراج التالي:
الإخراج:
يُظهر الناتج بوضوح أنه يتم عرض آخر مستندين في المجموعة. وبالتالي، أظهرنا بوضوح أنه لجلب آخر 'n' مستند في المجموعة، يمكننا أولاً فرز المستندات بترتيب تنازلي ثم استخدام شرط الحد لإرجاع عدد 'n' من المستندات المطلوبة.
ملاحظات: إذا تم إجراء البحث على سلسلة أكبر من 38,000 حرفًا، فلن يتم عرض النتائج الصحيحة.










