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