按ObjectId日期聚合MongoDB结果
发布时间:2020-12-14 00:50:26 所属栏目:百科 来源:网络整理
导读:如何通过ObjectId日期聚合我的MongoDB结果.例: 默认光标结果: cursor = [ {'_id': ObjectId('5220b974a61ad0000746c0d0'),'content': 'Foo'},{'_id': ObjectId('521f541d4ce02a000752763a'),'content': 'Bar'},{'_id': ObjectId('521ef350d24a9b00077090a5
如何通过ObjectId日期聚合我的MongoDB结果.例:
默认光标结果: cursor = [ {'_id': ObjectId('5220b974a61ad0000746c0d0'),'content': 'Foo'},{'_id': ObjectId('521f541d4ce02a000752763a'),'content': 'Bar'},{'_id': ObjectId('521ef350d24a9b00077090a5'),'content': 'Baz'},] 预计结果: projected_cursor = [ {'2013-09-08': {'_id': ObjectId('5220b974a61ad0000746c0d0'),'content': 'Bar'} },{'2013-09-07': {'_id': ObjectId('521ef350d24a9b00077090a5'),'content': 'Baz'} } ] 这是我目前在PyMongo中用来实现这些结果的方法,但它很混乱,我想看看如何使用MongoDB的聚合框架(甚至MapReduce)来做到这一点: cursor = db.find({},limit=10).sort("_id",pymongo.DESCENDING) messages = [x for x in cursor] this_date = lambda x: x['_id'].generation_time.date() dates = set([this_date(message) for message in messages]) dates_dict = {date: [m for m in messages if this_date(m) == date] for date in dates} 是的,我知道最简单的方法是简单地为每条记录添加一个新的日期字段,然后再按此汇总,但这不是我现在想要做的. 谢谢!
没有办法完成你对mongodb的要求
聚合框架,因为没有聚合运算符 可以将ObjectId变成类似日期的东西(尽管有一个 JIRA ticket).您 应该能够使用map-reduce完成你想要的东西,但是: // map function function domap() { // turn ObjectId --> ISODate var date = this._id.getTimestamp(); // format the date however you want var year = date.getFullYear(); var month = date.getMonth(); var day = date.getDate(); // yields date string as key,entire document as value emit(year+"-"+month+"-"+day,this); } // reduce function function doreduce(datestring,docs) { return {"date":datestring,"docs":docs}; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |