MongoDB: الحد من نتائج استعلام $ GT (من Pymongo)
سؤال
أقوم بجمع بعض الإحصائيات من خدمة الويب ، وأخزينها في مجموعة. تبدو البيانات مشابهة لهذا (ولكن مع المزيد من الحقول):
{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"}
{…}
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"}
إذا طلب شخص ما الأرقام اليومية خلال الثلاثين يومًا الماضية ، فهذا يعني أن الحد الأقصى للكمية (في هذا المثال) "تنزيل" العلاقات العامة. يوم. وهو السجل الأخير من اليوم.
باستخدام collection.find({"dt": {"$gt": datetime_obj_30_days_ago}})
, ، بالطبع أحصل على جميع الصفوف ، وهو أمر غير مناسب للغاية. لذلك أنا أبحث عن وسيلة لإرجاع آخر يوم فقط للفترة المحددة.
قيل لي أن group()
قد يكون الطريق للذهاب ، لكنني لا أستطيع أن أفهم تمامًا كيفية عمله في هذه الحالة.
أي نصائح ، ستكون المؤشرات موضع تقدير كبير!
المحلول
يمكنك القيام بذلك باستخدام مجموعة. في المثال الخاص بك ، ستحتاج إلى توفير وظيفة JavaScript لحساب المفتاح (وكذلك وظيفة تقليل) ، لأنك تريد فقط مكون التاريخ لحقل DateTime. هذا يجب أن يعمل:
db.coll.group(
key='function(doc) { return {"dt": doc.dt.toDateString()} }',
condition={'dt': {'$gt': datetime_obj_30_days_ago}},
initial={'downloads': 0},
reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }'
)
ضع في اعتبارك أنه لا يزال يقوم بإجراء فحص خطي للشهر الماضي ، فقط على الخادم بدلاً من العميل. إنه ممكن هذا ببساطة اختيار القيمة القصوى لكل يوم بشكل فردي أسرع.