MongoDB 日期操作指南

MongoDBMongoDBBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 MongoDB 处理日期,包括插入日期值、查询日期范围、格式化日期输出、更新日期字段以及按日期排序。你将探索多种插入日期的方法,例如使用当前日期、创建特定日期以及使用毫秒级时间戳。此外,你还将学习如何查询日期范围、格式化日期输出、更新日期字段以及按日期排序数据。本实验全面介绍了 MongoDB 中与日期相关的功能。

插入日期值

在这一步骤中,你将学习如何使用 MongoDB shell(mongosh)在 MongoDB 中插入日期值。日期是数据库中一种重要的数据类型,MongoDB 提供了强大的功能来处理它们。

首先,启动 MongoDB shell:

mongosh

接下来,为我们的日期实验创建一个数据库:

use datelab

MongoDB 允许你通过多种方式插入日期。我们将探索三种常见方法:

  1. 使用当前日期:
db.events.insertOne({
    event_name: "Lab Start",
    timestamp: new Date()
})
  1. 创建特定日期:
db.events.insertOne({
    event_name: "Conference",
    date: new Date("2024-06-15T10:30:00Z")
})
  1. 使用毫秒级时间戳:
db.events.insertOne({
    event_name: "Project Deadline",
    timestamp: new Date(1718476800000)
})

让我们验证插入的文档:

db.events.find()

示例输出:

[
  {
    _id: ObjectId("..."),
    event_name: 'Lab Start',
    timestamp: 2024-02-15T12:34:56.789Z
  },
  {
    _id: ObjectId("..."),
    event_name: 'Conference',
    date: 2024-06-15T10:30:00.000Z
  },
  {
    _id: ObjectId("..."),
    event_name: 'Project Deadline',
    timestamp: 2024-06-15T00:00:00.000Z
  }
]

让我们分解日期插入方法:

  • new Date() 创建当前时刻的时间戳
  • new Date("YYYY-MM-DDTHH:mm:ssZ") 创建特定的日期和时间
  • new Date(milliseconds) 从 Unix 时间戳(毫秒)创建日期

查询日期范围

在这一步骤中,你将学习如何在 MongoDB 中查询日期范围。基于上一步的内容,我们将使用 datelab 数据库来演示各种日期范围查询。

首先,确保我们位于正确的数据库并验证现有的文档:

use datelab
db.events.find()

接下来,添加更多事件以创建一个更有趣的数据集:

db.events.insertMany([
    {
        event_name: "Summer Conference",
        date: new Date("2024-07-15T09:00:00Z")
    },
    {
        event_name: "Winter Workshop",
        date: new Date("2024-01-20T14:30:00Z")
    },
    {
        event_name: "Spring Meetup",
        date: new Date("2024-04-10T11:15:00Z")
    }
])

让我们探索不同的日期范围查询方法:

  1. 查找特定日期之后的事件:
db.events.find({
    date: { $gt: new Date("2024-06-01") }
})
  1. 查找两个日期之间的事件:
db.events.find({
    date: {
        $gte: new Date("2024-01-01"),
        $lt: new Date("2024-06-01")
    }
})
  1. 使用日期比较运算符:
db.events.find({
    date: {
        $gte: new Date("2024-01-01"),
        $lte: new Date("2024-12-31")
    }
})

查询运算符的解释:

  • $gt: 大于
  • $gte: 大于或等于
  • $lt: 小于
  • $lte: 小于或等于

示例输出:

[
  {
    _id: ObjectId("..."),
    event_name: 'Winter Workshop',
    date: 2024-01-20T14:30:00.000Z
  },
  {
    _id: ObjectId("..."),
    event_name: 'Spring Meetup',
    date: 2024-04-10T11:15:00.000Z
  }
]

格式化日期输出

在这一步骤中,你将学习如何使用多种方法在 MongoDB 中格式化日期输出。我们将继续使用之前步骤中的 datelab 数据库。

首先,确保我们位于正确的数据库:

use datelab

MongoDB 提供了多种格式化日期的方式。我们将探索不同的格式化技术:

  1. 使用 $dateToString 聚合操作符:
db.events.aggregate([
    {
        $project: {
            event_name: 1,
            formatted_date: {
                $dateToString: {
                    format: "%Y-%m-%d %H:%M:%S",
                    date: "$date"
                }
            }
        }
    }
])
  1. 提取特定的日期组件:
db.events.aggregate([
    {
        $project: {
            event_name: 1,
            year: { $year: "$date" },
            month: { $month: "$date" },
            day: { $dayOfMonth: "$date" },
            hour: { $hour: "$date" }
        }
    }
])
  1. 创建自定义日期格式:
db.events.aggregate([
    {
        $project: {
            event_name: 1,
            custom_format: {
                $dateToString: {
                    format: "%B %d, %Y at %I:%M %p",
                    date: "$date"
                }
            }
        }
    }
])

日期格式化说明符:

  • %Y: 4 位数的年份
  • %m: 两位数的月份
  • %d: 月份中的日期
  • %H: 小时(24 小时制)
  • %I: 小时(12 小时制)
  • %M: 分钟
  • %S: 秒
  • %p: AM/PM 指示符

示例输出:

[
  {
    _id: ObjectId("..."),
    event_name: 'Summer Conference',
    formatted_date: '2024-07-15 09:00:00',
    year: 2024,
    month: 7,
    day: 15,
    hour: 9,
    custom_format: 'July 15, 2024 at 09:00 AM'
  }
]

更新日期字段

在这一步骤中,你将学习如何在 MongoDB 中更新日期字段。我们将继续使用之前步骤中的 datelab 数据库,并探索各种日期更新技术。

首先,确保我们位于正确的数据库:

use datelab

让我们先添加一些事件以便操作:

db.events.insertMany([
    {
        event_name: "Tech Conference",
        date: new Date("2024-08-20T10:00:00Z"),
        status: "Planned"
    },
    {
        event_name: "Developers Meetup",
        date: new Date("2024-09-15T14:30:00Z"),
        status: "Pending"
    }
])

现在,让我们探索不同的日期字段更新方法:

  1. 更新单个文档的日期:
db.events.updateOne(
    { event_name: "Tech Conference" },
    {
        $set: {
            date: new Date("2024-09-01T10:00:00Z"),
            status: "Confirmed"
        }
    }
)
  1. 使用日期操作更新多个文档:
db.events.updateMany(
    { date: { $lt: new Date("2024-07-01") } },
    {
        $set: {
            status: "Historical",
            updated_at: new Date()
        }
    }
)
  1. 使用 $currentDate 递增日期:
db.events.updateOne(
    { event_name: "Developers Meetup" },
    {
        $currentDate: {
            last_modified: true
        },
        $inc: {
            "event_duration.days": 1
        }
    }
)

让我们验证更新结果:

db.events.find()

示例输出:

[
  {
    _id: ObjectId("..."),
    event_name: 'Tech Conference',
    date: 2024-09-01T10:00:00.000Z,
    status: 'Confirmed'
  },
  {
    _id: ObjectId("..."),
    event_name: 'Developers Meetup',
    date: 2024-09-15T14:30:00.000Z,
    status: 'Pending',
    last_modified: ISODate("2024-02-15T12:34:56.789Z")
  }
]

关键更新操作符:

  • $set: 替换字段值
  • $currentDate: 使用当前时间戳更新
  • $inc: 递增数值
  • $unset: 移除字段

按日期排序

在这最后一步中,你将学习如何在 MongoDB 中按日期对文档进行排序。我们将继续使用之前步骤中的 datelab 数据库,并探索各种排序技术。

首先,确保我们位于正确的数据库:

use datelab

让我们添加更多事件以创建一个多样化的数据集:

db.events.insertMany([
    {
        event_name: "AI Summit",
        date: new Date("2024-10-15T09:00:00Z"),
        category: "Technology"
    },
    {
        event_name: "Blockchain Workshop",
        date: new Date("2024-05-22T14:30:00Z"),
        category: "Finance"
    },
    {
        event_name: "Cloud Computing Expo",
        date: new Date("2024-03-10T11:15:00Z"),
        category: "IT"
    }
])

现在,让我们探索按日期排序文档的不同方法:

  1. 按升序排序事件(从最早到最晚):
db.events.find().sort({ date: 1 })
  1. 按降序排序事件(从最晚到最早):
db.events.find().sort({ date: -1 })
  1. 将排序与过滤结合:
db.events.find({
    category: "Technology"
}).sort({ date: 1 })
  1. 使用多个条件进行高级排序:
db.events.find().sort({
    category: 1,  // 首先按类别排序
    date: -1      // 然后按日期降序排序
})

让我们验证排序结果:

db.events.find({}, {
    event_name: 1,
    date: 1,
    category: 1
}).sort({ date: 1 })

示例输出:

[
  {
    _id: ObjectId("..."),
    event_name: 'Cloud Computing Expo',
    date: 2024-03-10T11:15:00.000Z,
    category: 'IT'
  },
  {
    _id: ObjectId("..."),
    event_name: 'Blockchain Workshop',
    date: 2024-05-22T14:30:00.000Z,
    category: 'Finance'
  },
  {
    _id: ObjectId("..."),
    event_name: 'AI Summit',
    date: 2024-10-15T09:00:00.000Z,
    category: 'Technology'
  }
]

排序关键点:

  • 1: 升序
  • -1: 降序
  • 可以按多个字段排序
  • 适用于日期、字符串、数字

总结

在本实验中,你学习了如何使用多种方法在 MongoDB 中插入日期值,包括使用当前日期、创建特定日期以及使用毫秒级时间戳。你还探索了查询日期范围、格式化日期输出、更新日期字段以及按日期排序。这些技术对于在 MongoDB 应用程序中处理时间数据至关重要。

实验涵盖了关键概念,例如创建数据库、插入带有日期字段的文档、基于日期范围查询数据、格式化日期输出、更新与日期相关的字段以及按日期排序数据。这些技能对于构建需要处理 MongoDB 数据库中日期和时间戳的应用程序至关重要。