كيف يمكنني معرفة ما إذا كان هناك المزيد من النتائج من استعلام في MongoDB؟

StackOverflow https://stackoverflow.com/questions/3517825

  •  29-09-2019
  •  | 
  •  

سؤال

هل هناك طريقة مفضلة للاستعلام عن Mongo مع حد ومعرفة ما إذا كان سيكون هناك المزيد من النتائج إذا قمت بالاستعلام عن الصفحة التالية مع Skip/Limit؟

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

n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]

أشعر أن هذه حالة استخدام شائعة (مع العلم ما إذا كان سيتم عرض زر "المزيد من النتائج" على موقع ويب) وأشعر بالغباء مع الحل الحالي.

هل كانت مفيدة؟

المحلول

MongoDB لديه مؤشرات ذيل, ، والتي تسمح لك بإعادة استخدام المؤشر بعد إرجاع جميع البيانات. سيبدو شيء هكذا:

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()

لاحظ أنه لا يوجد سوى 10 مستندات تم استردادها ، ولكن يمكن فحص المؤشر لتحديد ما إذا كان هناك المزيد من الكائنات المتاحة. المشكلة الوحيدة هي أن المؤشرات القابلة للذيل لا يمكن استخدامها إلا على مجموعات مغلقة.

يمكن أيضًا استخدام ما سبق مع مؤشر منتظم ، ولكن يجب عليك الاستعلام عن n + 1 مستندات. هذا هو في الأساس نفس الحل الذي تستخدمه الآن. عليك أن تستخدم size() رغم ذلك ، لأن هذا يأخذ تخطي المعدلات في الاعتبار.

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n

لست على دراية بـ Pymongo ، لذلك لا أعرف ذلك بالتأكيد ، ولكن هناك احتمال أن يرسل هذا الحل n + 1 المستندات الكاملة لتطبيقك ، بدلاً من المطلوب n, ، مما أدى إلى النطاق الترددي البسيط. إذا كان هذا هو الحال ، فقد ترغب في إنشاء وظيفة من جانب الخادم تفعل الشيء نفسه ، ولكن فقط إرجاع كائن يحتوي n المستندات في صفيف ، وعلم يشير إلى ما إذا كان n + 1العاشر الوثيقة متوفرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top