按ObjectId日期聚合MongoDB结果

前端之家收集整理的这篇文章主要介绍了按ObjectId日期聚合MongoDB结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何通过ObjectId日期聚合我的MongoDB结果.例:

默认光标结果:

  1. cursor = [
  2. {'_id': ObjectId('5220b974a61ad0000746c0d0'),'content': 'Foo'},{'_id': ObjectId('521f541d4ce02a000752763a'),'content': 'Bar'},{'_id': ObjectId('521ef350d24a9b00077090a5'),'content': 'Baz'},]

预计结果:

  1. projected_cursor = [
  2. {'2013-09-08':
  3. {'_id': ObjectId('5220b974a61ad0000746c0d0'),'content': 'Bar'}
  4. },{'2013-09-07':
  5. {'_id': ObjectId('521ef350d24a9b00077090a5'),'content': 'Baz'}
  6. }
  7. ]

这是我目前在PyMongo中用来实现这些结果的方法,但它很混乱,我想看看如何使用MongoDB的聚合框架(甚至MapReduce)来做到这一点:

  1. cursor = db.find({},limit=10).sort("_id",pymongo.DESCENDING)
  2. messages = [x for x in cursor]
  3. this_date = lambda x: x['_id'].generation_time.date()
  4. dates = set([this_date(message) for message in messages])
  5. dates_dict = {date: [m for m in messages if this_date(m) == date] for date in dates}

是的,我知道最简单的方法是简单地为每条记录添加一个新的日期字段,然后再按此汇总,但这不是我现在想要做的.

谢谢!

没有办法完成你对mongodb的要求
聚合框架,因为没有聚合运算符
可以将ObjectId变成类似日期的东西(尽管有一个 JIRA
ticket
).您
应该能够使用map-reduce完成你想要的东西,但是:
  1. // map function
  2. function domap() {
  3. // turn ObjectId --> ISODate
  4. var date = this._id.getTimestamp();
  5. // format the date however you want
  6. var year = date.getFullYear();
  7. var month = date.getMonth();
  8. var day = date.getDate();
  9.  
  10. // yields date string as key,entire document as value
  11. emit(year+"-"+month+"-"+day,this);
  12. }
  13.  
  14. // reduce function
  15. function doreduce(datestring,docs) {
  16. return {"date":datestring,"docs":docs};
  17. }

猜你在找的设计模式相关文章