MongoDB $toObjectId 运算符介绍

$toObjectId 是 Mongodb 中的一个内置运算符,用于将字符串转换为 ObjectId。可以用于聚合管道操作中的投影、筛选等操作。

语法

$toObjectId 运算符的语法如下:

{ $toObjectId: <expression> }

其中,<expression> 是一个字符串表达式,可以是任何表达式,但通常是一个字段名。

使用场景

在 MongoDB 中,_id 字段通常存储为 ObjectId 类型,而且 MongoDB 的查询操作中,可以通过 _id 字段查找文档。因此,在某些场景下,我们需要将一个字符串类型的字段转换成 ObjectId 类型,以便于查询或者排序。

示例

以下是 $toObjectId 运算符的两个示例:

示例 1

假设我们有一个 users 集合,每个文档都包含一个 _id 字段,该字段存储的是一个字符串类型的 UUID,我们想要将 _id 字段转换成 ObjectId 类型,以便于查询或者排序。

创建 users 集合,并插入两个文档

db.users.insertMany([
  { _id: "5cfc7b8e37ab39164c1d33a1", name: "Alice" },
  { _id: "5cfc7b8e37ab39164c1d33a2", name: "Bob" }
])

使用 $toObjectId_id 字段转换成 ObjectId 类型

db.users.aggregate([
  {
    $project: {
      _id: { $toObjectId: "$_id" },
      name: 1
    }
  }
])

以上代码中,我们使用 $project 运算符将 _id 字段转换成 ObjectId 类型。

输出结果如下:

{ "_id" : ObjectId("5cfc7b8e37ab39164c1d33a1"), "name" : "Alice" }
{ "_id" : ObjectId("5cfc7b8e37ab39164c1d33a2"), "name" : "Bob" }

示例 2

假设我们有一个 orders 集合,每个文档都包含一个 orderDate 字段,该字段存储的是一个字符串类型的日期,我们想要按照日期排序。

创建 orders 集合,并插入两个文档

db.orders.insertMany([
  { orderDate: "2022-03-03", amount: 100 },
  { orderDate: "2022-03-01", amount: 200 }
])

使用 $toObjectId 将 orderDate 字段转换成 ObjectId 类型

db.orders.aggregate([
  {
    $project: {
      orderDate: { $toDate: "$orderDate" },
      amount: 1
    }
  },
  {
    $sort: {
      orderDate: 1
    }
  }
])

以上代码中,我们使用 $project 运算符将 orderDate 字段转换成日期类型,然后使用 $sort 运算符将数据按 orderDate 升序排序,最后使用 $project 运算符再次将 orderDate 转换回字符串类型。

需要注意的是,在 $project 运算符中使用了 $dateToString 运算符,将日期类型的 orderDate 字段转换为字符串类型,并指定了输出格式。在这个示例中,我们使用了 “YYYY-MM-DD” 的格式。如果需要指定其他输出格式,可以参考 Mongodb 官方文档中的相关内容。

结论

$toObjectId 运算符可以将指定的字符串转换成 ObjectId 类型,常用于查询语句中需要使用 ObjectId 的场景。在示例中,我们展示了 $toObjectId 运算符在查询时的应用,并且提供了两个完整的示例以帮助读者更好地理解。在实际应用中,如果需要使用 ObjectId 类型进行查询操作,$toObjectId 运算符是非常有用的工具。