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

ما هي تعديلات الاستعلام؟
Mongo DB يوفر تعديلات الاستعلام مثل شرطي "limit" و"Orders" لتوفير المزيد من المرونة عند تنفيذ الاستعلامات. سنلقي نظرة على تعديلات الاستعلام التالية
MongoDB الحد من نتائج الاستعلام
يتم استخدام هذا التعديل لتحديد عدد المستندات التي يتم إرجاعها في مجموعة النتائج الخاصة باستعلام ما. يوضح المثال التالي كيفية القيام بذلك.
db.Employee.find().limit(2).forEach(printjson);
Code تفسير
- يأخذ الكود أعلاه وظيفة البحث التي تقوم بإرجاع كافة المستندات الموجودة في المجموعة ولكنها تستخدم بعد ذلك جملة الحد للحد من عدد المستندات التي يتم إرجاعها إلى 2 فقط.
الناتج
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الناتج التالي
يُظهر الإخراج بوضوح أنه نظرًا لوجود معدل حد، يتم إرجاع سجلين فقط على الأكثر كجزء من مجموعة النتائج بناءً على ObjectId بترتيب تصاعدي.
MongoDB الترتيب حسب الترتيب التنازلي
يمكنك تحديد ترتيب المستندات المطلوب إرجاعها بناءً على الترتيب التصاعدي أو التنازلي لأي مفتاح في المجموعة. يوضح المثال التالي كيفية القيام بذلك.
db.Employee.find().sort({Employeeid:-1}).forEach(printjson)
Code تفسير
- يأخذ الكود أعلاه وظيفة الفرز التي تقوم بإرجاع جميع المستندات الموجودة في المجموعة ولكنها تستخدم بعد ذلك المُعدِّل لتغيير الترتيب الذي يتم به إرجاع السجلات. يشير -1 هنا إلى أننا نريد إرجاع المستندات بناءً على الترتيب التنازلي لمعرف الموظف.
إذا تم تنفيذ الأمر بنجاح، سيتم عرض الناتج التالي
الناتج
يُظهر الإخراج بوضوح المستندات التي يتم إرجاعها بترتيب تنازلي لمعرف الموظف.
يتم تعريف الترتيب التصاعدي بالقيمة 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)
لإنشاء نظام تنقل صفحة بصفحة، اتبع هذا النمط:
- حدد حجم الصفحة، على سبيل المثال مستندين في الصفحة الواحدة.
- اضرب حجم الصفحة في رقم الصفحة ناقص واحد للحصول على قيمة التخطي.
- مرر تلك القيمة إلى الدالة 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)
ترتيب المفاتيح في كائن الفرز مهم: يُطبّق اسم الموظف أولاً لأنه يظهر أولاً. يُفيد هذا الفرز متعدد المفاتيح في التقارير التي تُجمّع البيانات حسب حقل واحد ثم تُرتّبها داخل كل مجموعة. وللحصول على أفضل أداء مع المجموعات الكبيرة، أنشئ فهرسًا مُركّبًا يُطابق الحقول والاتجاهات المُستخدمة في الفرز.


