mongodb有時會有涉及到統計的業務,這時候考慮使用aggregate和pipeline來完成最終結果,
是一種高效的方案,最好針對match條件建索引,其中的處理過程盡量簡化
- match 是篩選資料使用
- project 主要擷取哪些字段
- group 相當于mysql的group by 分組語句
- sort 針對結果排序
- lookup 關聯其他表,擷取其他表的字段内容
- unwind 遇到一些字段屬性是數組對象,然後又需要對這些數組對象進行統計。
- 這時候就需要用到$unwind操作符
- addFields 加入一些需要再傳回結果中出現的字段内容
db.zl_im_chat_connect.aggregate([{
"$match": {
"create_time": {
"$gte": 1627747200,
"$lt": 1630252800
},
"to_user_type": 3,
"from_user_type": {
"$in": [0, 1]
},
"from_msg_num":{"$gt":2},
"to_msg_num":{"$gt":2}
}
}, {
"$project": {
"_id": 0,
"chat_id": 1,
"connect_id": 1,
"from_im_id": 1,
"to_im_id": 1,
"im_gid": 1,
"create_time": 1,
"update_time": 1,
"date1": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": {
"$toDate": {
"$add": [28800000, {
"$multiply": ["$create_time", 1000]
}]
}
}
}
}
}
}, {
"$group": {
"_id": {
"chat_id": "$chat_id",
"to_im_id": "$to_im_id",
"date1": "$date1"
},
"chatCount": {
"$sum": 1
}
}
}, {
"$group": {
"_id": {
"to_im_id": "$_id.to_im_id",
"date1": "$_id.date1"
},
"chatCount": {
"$sum": 1
}
}
}, {
"$group": {
"_id": {
"to_im_id": "$_id.to_im_id"
},
"chatCount": {
"$sum": "$chatCount"
},
"dayCount": {
"$sum": 1
}
}
}, {
"$lookup": {
"from": "zl_im_user",
"localField": "_id.to_im_id",
"foreignField": "im_id",
"as": "d1"
}
}, {
"$sort": {
"d1.uid": 1
}
}, {
"$project": {
"_id.to_im_id": 1,
"chatCount": 1,
"d1.uid": 1,
"d1.nickname": 1,
"d1.real_name": 1,
"d1.user_type": 1,
"d1.sale_group": 1
}
}, {
"$unwind": "$d1"
}, {
"$addFields": {
"uid": "$d1.uid",
"nickname": "$d1.nickname",
"real_name": "$d1.real_name",
"sale_group": "$d1.sale_group"
}
}])