如何解决如何在mongo db聚集中将数据作为数组获取
假设这是我的数据模式
{
"_id" : ObjectId("5f90ed2954d61feed1720603"),"date" : ISODate("2020-10-22T00:00:00Z"),"worker_full_name" : "JOHN DOE","worker_department" : "Worker Department","type" : "Worker","site_name" : "DL LIMITED","in_time" : ISODate("2020-10-22T07:53:35Z"),"attendance_points" : 2,"out_time" : ISODate("2020-10-22T22:03:41Z"),"duration" : 14,"attendance_count" : 2,"wage" : 580,"in_location" : "Countryside Avenue","worker_aadhar_card_number" : "xxxxxxxxxxxx","out_location" : "Golf Drive","worker_id" : ObjectId("5f12ea794fdb64e82ce68fac")
}
{
"_id" : ObjectId("5f90ed2754d61feed17205fe"),"worker_full_name" : "JOHN DOE 2","in_time" : ISODate("2020-10-22T07:53:34Z"),"out_time" : ISODate("2020-10-22T22:24:02Z"),"wage" : 0,"out_location" : "Countryside Avenue","worker_id" : ObjectId("5f688cf2df29927bfb8531eb")
}
我正在执行以下汇总操作:
my_collection.aggregate([{'$match': {'date': {"$gte": start_date,"$lte": end_date},'worker_full_name': {"$exists": 'true'},"site_name": site_name
}},{"$group": {'_id': {
'worker_id': '$worker_id','worker_full_name': '$worker_full_name'
},'present_days': {'$sum': 1},'total_shift_points': {'$sum': '$attendance_points'}
}}
])
这样做,我可以实现以下输出:
{'_id': {'worker_id': ObjectId('5f688cf2df29927bfb8531d6'),'worker_full_name': 'JOHN DOE'},'present_days': 22,'total_shift_points': 38.25}
{'_id': {'worker_id': ObjectId('5f66130f94c75522f314dbc0'),'worker_full_name': 'JOHN DOE 2'},'present_days': 19,'total_shift_points': 35.25}
{'_id': {'worker_id': ObjectId('5f66130e94c75522f314db99'),'worker_full_name': 'JOHN DOE 3'},'present_days': 23,'total_shift_points': 42.75}
{'_id': {'worker_id': ObjectId('5f27b678749921225e5df98c'),'worker_full_name': 'JOHN DOE 4 '},'total_shift_points': 38.25}
{'_id': {'worker_id': ObjectId('5f6f2ac0b112533f081c3bae'),'worker_full_name': 'JOHN DOE 5'},'present_days': 21,'total_shift_points': 36.75}
但是有什么办法可以使数组中的所有点像下面的期望输出一样,其中我通过单个查询返回每日Attenance_points数组及其对应的日期:
{'_id': {'worker_id': ObjectId('5f688cf2df29927bfb8531d6'),'total_shift_points': 38.25,'daily_points_stats':[
{ISODate("2020-10-01T00:00:00Z"):2},{ISODate("2020-10-02T00:00:00Z"):1.5}
{ISODate("2020-10-03T00:00:00Z"):1}
{ISODate("2020-10-04T00:00:00Z"):1.25}
..
..for all the days
]}
或者类似这样的东西:
{'_id': {'worker_id': ObjectId('5f688cf2df29927bfb8531d6'),'daily_points_stats':[
{"date":ISODate("2020-10-01T00:00:00Z"),"points":2},{"date":ISODate("2020-10-02T00:00:00Z"),"points":1.5},{"date":ISODate("2020-10-03T00:00:00Z"),"points":1},{"date":ISODate("2020-10-04T00:00:00Z"),"points":1.25},..
..for all the days
]}
解决方法
您可以使用$group
在$push
内创建一个数组,
{
"$group": {
"_id": {
"worker_id": "$worker_id","worker_full_name": "$worker_full_name"
},// like this
daily_points_stats: {
$push: {
date: "$date",points: "$attendance_count"
}
},"present_days": { "$sum": 1 },"total_shift_points": { "$sum": "$attendance_points" }
}
}
如果您想要一个对象,则可以尝试
- $ push k(key)和v(value),将键转换为字符串类型,因为其日期类型使用
$toString
-
$addFields
使用$arrayToObject
将数组转换为对象
{
"$group": {
"_id": {
"worker_id": "$worker_id",daily_points_stats: {
$push: {
k: { $toString: "$date" },v: "$attendance_count"
}
},"total_shift_points": { "$sum": "$attendance_points" }
}
},{
$addFields: {
daily_points_stats: {
$arrayToObject: "$daily_points_stats"
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。