MongoDB 查询分享 包含( 筛选 分组 排序 脱敏 格式化日期)

MongoDB 查询分享 包含( 筛选 分组 排序 脱敏 格式化日期)

1. 概述

本文档介绍如何在 MongoDB 中查询集合 userCollection,并执行以下操作:

  1. 根据 userId 字段进行筛选。
  2. lastLogin 字段进行排序和分组。
  3. phoneNumber 字段进行脱敏处理。
  4. lastLogin 字段的日期进行时间加法操作。
  5. lastLogin 字段格式化为 yyyy-MM-dd HH:mm:ss 格式。

2. 查询示例

以下是完整的 MongoDB 聚合查询语句:

javascript 复制代码
db.getCollection("userCollection").aggregate([
    {
        "$match": {
            "userId": { 
                "$in": [
                    "user_01",
                    "user_02",
                    "user_03"
                ] 
            }
        }
    },
    {
        "$sort": { "lastLogin": -1 } // 按照lastLogin降序排序
    },
    {
        "$group": {
            "_id": "$userId",
            "lastLogin": { "$first": "$lastLogin" }, // 取每个userId分组后的第一条
            "phoneNumber": { "$first": "$phoneNumber" } // 取每个userId分组后的第一条phoneNumber
        }
    },
    {
        "$addFields": {
            "lastLogin": {
                "$dateAdd": {
                    "startDate": "$lastLogin",
                    "unit": "hour",
                    "amount": 5 // 加5小时
                }
            }
        }
    },
    {
        "$addFields": {
            "lastLogin": {
                "$dateToString": {
                    "format": "%Y-%m-%d %H:%M:%S",
                    "date": "$lastLogin",
                    "timezone": "Asia/Shanghai" // 使用特定时区格式化
                }
            },
            "phoneNumber": {
                "$concat": [
                    { "$substr": ["$phoneNumber", 0, 3] }, // 保留前三位
                    "****",                                // 中间部分脱敏
                    { "$substr": ["$phoneNumber", -4, 4] }  // 保留后四位
                ]
            }
        }
    },
    {
        "$project": {
            "userId": "$_id",
            "lastLogin": 1,
            "phoneNumber": 1,
            "_id": 0
        }
    }
])

3. 关键字和函数详解

3.1 $match

$match 是一个过滤阶段,用于筛选集合中符合条件的文档。在本例中,我们使用 $match 筛选 userId 字段在指定列表中的文档。

javascript 复制代码
{
    "$match": {
        "userId": { 
            "$in": [
                "user_01",
                "user_02",
                "user_03"
            ] 
        }
    }
}
  • $in :用于匹配字段值在指定数组中的文档。它相当于 SQL 中的 IN 操作符。

3.2 $sort

$sort 用于对查询结果进行排序。在本例中,我们按照 lastLogin 字段的降序排序,以便在后续的分组操作中能够获取每个分组内最新的记录。

javascript 复制代码
{
    "$sort": { "lastLogin": -1 }
}
  • -1 :表示降序排列。1 表示升序排列。

3.3 $group

$group 用于将文档分组,并对每个组进行聚合操作。在本例中,我们按 userId 字段进行分组,并使用 $first 获取每组中最新的 lastLogin 值和 phoneNumber

javascript 复制代码
{
    "$group": {
        "_id": "$userId",
        "lastLogin": { "$first": "$lastLogin" },
        "phoneNumber": { "$first": "$phoneNumber" }
    }
}
  • _id :表示分组的依据,在本例中是 userId 字段。
  • $first :返回按排序后的文档组中的第一个文档的值。在排序后用于获取最新的 lastLogin

3.4 $addFields

$addFields 用于向文档中添加新字段或修改现有字段的值。在本例中,我们使用两次 $addFields

  1. 第一次用于将 lastLogin 日期加上 5 小时。
  2. 第二次用于将 lastLogin 格式化为指定格式,并对 phoneNumber 进行脱敏处理。
javascript 复制代码
{
    "$addFields": {
        "lastLogin": {
            "$dateAdd": {
                "startDate": "$lastLogin",
                "unit": "hour",
                "amount": 5
            }
        }
    }
}
  • $dateAdd :用于对日期进行加减操作。startDate 是初始日期,unit 是操作的时间单位(如 "hour"、"day"),amount 是要加的数量。
javascript 复制代码
{
    "$addFields": {
        "lastLogin": {
            "$dateToString": {
                "format": "%Y-%m-%d %H:%M:%S",
                "date": "$lastLogin",
                "timezone": "Asia/Shanghai"
            }
        },
        "phoneNumber": {
            "$concat": [
                { "$substr": ["$phoneNumber", 0, 3] }, // 保留前三位
                "****",                                // 中间部分脱敏
                { "$substr": ["$phoneNumber", -4, 4] }  // 保留后四位
            ]
        }
    }
}
  • $dateToString :用于将日期转换为指定格式的字符串。format 指定输出格式,date 是要格式化的日期字段,timezone 用于指定时间格式的时区。
  • $substr:用于截取字符串中的部分字符。
  • $concat:用于将多个字符串连接成一个字符串。

3.5 $project

$project 用于选择返回文档中的哪些字段,并可以对字段重命名或排除字段。在本例中,我们选择了 userIdlastLoginphoneNumber 字段,并隐藏了 _id 字段。

javascript 复制代码
{
    "$project": {
        "userId": "$_id",
        "lastLogin": 1,
        "phoneNumber": 1,
        "_id": 0
    }
}
  • 1:表示包括该字段。
  • 0:表示排除该字段。
  • userId: "$_id" :将 _id 字段的值赋给 userId,从而重命名该字段。

4. 总结

本例通过 MongoDB 的聚合操作实现了复杂的数据处理任务,包括筛选、排序、分组、脱敏、日期加法和格式化操作。通过对关键字和函数的合理使用,能够有效地提取并处理所需数据,同时保护敏感信息。

在实际应用中,可以根据具体需求调整查询语句,以适应不同的业务场景。如果需要进一步的优化或调整,请根据实际需求修改相关的聚合管道步骤。

相关推荐
清风1981几秒前
kafka消息可靠性传输语义
数据库·分布式·kafka
数据智能老司机2 小时前
CockroachDB权威指南——SQL调优
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——应用设计与实现
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——CockroachDB 模式设计
数据库·分布式·架构
数据智能老司机21 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机1 天前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿1 天前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆1 天前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601011 天前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机1 天前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构