سؤال

أقوم بجمع بعض الإحصائيات من خدمة الويب ، وأخزينها في مجموعة. تبدو البيانات مشابهة لهذا (ولكن مع المزيد من الحقول):

{"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) }'
)

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

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