MongoDB الاستعلام عن الترتيب () والحد () مع الترتيب حسب الأمثلة

⚡ ملخص ذكي

MongoDB تتحكم مُعدِّلات الاستعلام Sort() و Limit() في عدد المستندات التي يُرجعها الاستعلام وترتيبها. تحدد الدالة limit() الحد الأقصى لعدد النتائج، بينما تُرتِّب الدالة sort() المستندات تصاعديًا أو تنازليًا باستخدام القيمتين 1 أو -1.

  • 🔢 نتائج الحد: تحدد طريقة limit() عدد المستندات التي يعيدها الاستعلام، على سبيل المثال، تُرجع limit(2) سجلين.
  • ⬇️ الترتيب تنازلياً: تقوم الدالة sort({field:-1}) بإرجاع المستندات بترتيب تنازلي حسب الحقل المختار.
  • ⬆️ الترتيب تصاعدياً: تقوم الدالة sort({field:1}) بإرجاع المستندات بترتيب تصاعدي، وهو أيضًا الاتجاه الافتراضي.
  • ⏭️ انتقل إلى صفحة أخرى: تتجاهل الدالة skip() عددًا من المستندات، وبالاقتران مع الدالة limit() تقوم بإنشاء ترقيم الصفحات.
  • 🧷 مفاتيح متعددة: تقبل الدالة sort() عدة حقول، وتقوم بالفرز حسب المفتاح الأول ثم تكسر التعادلات باستخدام المفتاح التالي.
  • 🖨️ Readable الإخراج: يؤدي استخدام forEach(printjson) في سلسلة من عمليات الطباعة إلى طباعة كل مستند يتم إرجاعه بتنسيق JSON نظيف.

MongoDB استعلام الفرز والتقييد

ما هي تعديلات الاستعلام؟

Mongo DB يوفر تعديلات الاستعلام مثل شرطي "limit" و"Orders" لتوفير المزيد من المرونة عند تنفيذ الاستعلامات. سنلقي نظرة على تعديلات الاستعلام التالية

MongoDB الحد من نتائج الاستعلام

يتم استخدام هذا التعديل لتحديد عدد المستندات التي يتم إرجاعها في مجموعة النتائج الخاصة باستعلام ما. يوضح المثال التالي كيفية القيام بذلك.

db.Employee.find().limit(2).forEach(printjson);

Code تفسير

  • يأخذ الكود أعلاه وظيفة البحث التي تقوم بإرجاع كافة المستندات الموجودة في المجموعة ولكنها تستخدم بعد ذلك جملة الحد للحد من عدد المستندات التي يتم إرجاعها إلى 2 فقط.

الناتج

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

MongoDB الحد من نتائج الاستعلام

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

MongoDB الترتيب حسب الترتيب التنازلي

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

db.Employee.find().sort({Employeeid:-1}).forEach(printjson)

Code تفسير

  • يأخذ الكود أعلاه وظيفة الفرز التي تقوم بإرجاع جميع المستندات الموجودة في المجموعة ولكنها تستخدم بعد ذلك المُعدِّل لتغيير الترتيب الذي يتم به إرجاع السجلات. يشير -1 هنا إلى أننا نريد إرجاع المستندات بناءً على الترتيب التنازلي لمعرف الموظف.

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

الناتج

MongoDB الترتيب حسب الترتيب التنازلي

يُظهر الإخراج بوضوح المستندات التي يتم إرجاعها بترتيب تنازلي لمعرف الموظف.

يتم تعريف الترتيب التصاعدي بالقيمة 1.

MongoDB فرز حسب الترتيب التصاعدي

كما يمكن للدالة sort() أن تُعيد المستندات بترتيب تنازلي، يمكنها أيضًا إعادتها بترتيب تصاعدي. يُحدد الترتيب التصاعدي بالقيمة 1 في كائن sort. هذا يُرتب المستندات من أصغر قيمة إلى أكبرها، وهو أمر مفيد لعرض السجلات من الأقدم إلى الأحدث أو من الألف إلى الياء.

يوضح المثال التالي كيفية فرز جميع مستندات الموظفين حسب رقم الموظف (Employeeid) بترتيب تصاعدي:

db.Employee.find().sort({Employeeid:1}).forEach(printjson)

إليك كيفية عمل الاستعلام:

  • تقوم الدالة find() باسترجاع جميع المستندات الموجودة في مجموعة الموظفين.
  • تقوم الدالة sort({Employeeid:1}) بترتيب النتائج حسب حقل Employeeid، من أدنى معرف إلى أعلى معرف.
  • تقوم الدالة forEach(printjson) بطباعة كل مستند بصيغة JSON قابلة للقراءة.

عند تشغيل هذا الأمر، ستظهر المستندات مرتبةً تصاعديًا حسب رقم الموظف (Employeeid). الترتيب التصاعدي هو الترتيب الافتراضي، لذا فإن ترك القيمة 1 يُعطي ترتيبًا تصاعديًا للحقل المُختار. لعكس النتيجة، غيّر القيمة من 1 إلى -1، ويمكنك أيضًا استخدام دالة limit() لعرض أول بضعة سجلات مُرتبة فقط.

MongoDB تخطي () للترقيم

تُخبر الدالة skip() MongoDB لتجاهل عدد محدد من المستندات قبل عرض الباقي. نادرًا ما تكون دالة skip() مفيدة بمفردها، ولكن عند دمجها مع دالة limit()، فإنها تُنشئ ترقيمًا للصفحات، مما يسمح لك بعرض النتائج صفحةً صفحة.

يتجاهل المثال التالي أول موظفين ويعيد الموظفين التاليين:

db.Employee.find().skip(2).limit(2).forEach(printjson)

لإنشاء نظام تنقل صفحة بصفحة، اتبع هذا النمط:

  1. حدد حجم الصفحة، على سبيل المثال مستندين في الصفحة الواحدة.
  2. اضرب حجم الصفحة في رقم الصفحة ناقص واحد للحصول على قيمة التخطي.
  3. مرر تلك القيمة إلى الدالة skip() وحجم الصفحة إلى الدالة limit().

على سبيل المثال، تستخدم الصفحة 1 الدالة skip(0).limit(2)، وتستخدم الصفحة 2 الدالة skip(2).limit(2)، وتستخدم الصفحة 3 الدالة skip(4).limit(2). أضف دائمًا الدالة sort() أيضًا، لضمان ثبات ترتيب المستندات عبر الصفحات. لاحظ أن قيم skip الكبيرة جدًا قد تُبطئ الأداء مع المجموعات الكبيرة، لأن MongoDB لا يزال يقوم بمسح المستندات التي تم تخطيها والتخلص منها؛ أما الترقيم القائم على النطاق فهو أسرع عند التعامل مع كميات كبيرة من المستندات.

فرز حسب حقول متعددة في MongoDB

MongoDB يمكنك الفرز حسب أكثر من حقل في الوقت نفسه. تُدرج الحقول في كائن الفرز حسب ترتيب الأولوية، و MongoDB يقوم بالفرز حسب الحقل الأول، ثم يستخدم الحقل التالي لكسر التعادلات، وهكذا.

يوضح المثال التالي كيفية فرز الموظفين حسب الاسم بترتيب تصاعدي، وبالنسبة للموظفين الذين يحملون نفس الاسم، يتم فرزهم حسب رقم الموظف بترتيب تنازلي:

db.Employee.find().sort({EmployeeName:1, Employeeid:-1}).forEach(printjson)

ترتيب المفاتيح في كائن الفرز مهم: يُطبّق اسم الموظف أولاً لأنه يظهر أولاً. يُفيد هذا الفرز متعدد المفاتيح في التقارير التي تُجمّع البيانات حسب حقل واحد ثم تُرتّبها داخل كل مجموعة. وللحصول على أفضل أداء مع المجموعات الكبيرة، أنشئ فهرسًا مُركّبًا يُطابق الحقول والاتجاهات المُستخدمة في الفرز.

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

بدون دالة sort()، MongoDB يُعيد هذا الأمر ترتيب المستندات ترتيبًا طبيعيًا، وهو ما يعكس عادةً ترتيبها على القرص، ولكنه ليس مضمونًا. وللحصول على ترتيب يمكن التنبؤ به، يُنصح دائمًا بإضافة دالة sort() صريحة على حقل مثل _id.

منطقيا، MongoDB تُطبّق دالة sort() دائمًا قبل دالة limit()، بغض النظر عن ترتيب تنفيذهما. هذا يعني أن دالة limit() تُعيد أفضل المستندات في النتيجة المُرتّبة، وليس مجموعة فرعية عشوائية يتم ترتيبها لاحقًا.

يؤدي فرز مجموعات النتائج الكبيرة بدون فهرس إلى فرض فرز في الذاكرة، والذي يفشل بمجرد تجاوز حد الذاكرة. يتيح إنشاء فهرس على حقل الفرز MongoDB إرجاع النتائج المرتبة بكفاءة.

بإمكان الذكاء الاصطناعي تحويل طلب بسيط مثل "أحدث خمسة موظفين" إلى استعلام يتضمن البحث والفرز والحدّ، مع تحديد الاتجاه والعدد الصحيحين. كما يشرح كل مُعدِّل ليسهل على المبتدئين فهم النمط.

نعم. يمكن للذكاء الاصطناعي فحص خطة الاستعلام، واكتشاف عمليات الفرز في الذاكرة، واقتراح الفهرس اللازم لدعم عملية الفرز. وهذا يساعد المطورين على تسريع عملية الفرز والحد من الاستعلامات على المجموعات الكبيرة.

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