天天看點

mongodb 聚合語句

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"

    }

}])