gpt4 book ai didi

mongodb - 按 ObjectId 日期聚合 MongoDB 结果

转载 作者:IT老高 更新时间:2023-10-28 13:33:22 25 4
gpt4 key购买 nike

如何按 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': 'Foo'},
{'_id': ObjectId('521f541d4ce02a000752763a'),'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}

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

谢谢!

最佳答案

更新:现在有一种内置方法可以做到这一点,请参阅 https://stackoverflow.com/a/51766657/295687

没有办法用 mongodb 完成你的要求聚合框架,因为没有聚合运算符可以将 ObjectId 变成类似日期的东西(不过有一个 JIRAticket )。你应该能够使用 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};
}

关于mongodb - 按 ObjectId 日期聚合 MongoDB 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com