MongoDB $substrCP 运算符介绍

$substrCP 是 MongoDB 中的一个字符串聚合运算符,用于按代码点从字符串中提取子字符串。代码点是指每个字符在 Unicode 编码表中的唯一数字标识符。

语法

$substrCP 运算符的语法如下所示:

{ $substrCP: [ <string>, <startingIndex>, <length> ] }
  • <string>:需要提取子字符串的字符串。
  • <startingIndex>:提取子字符串的起始位置,从 0 开始计数。
  • <length>:需要提取的子字符串的长度。如果没有指定,则提取从起始位置开始到字符串的末尾的所有字符。

使用场景

$substrCP 运算符通常用于以下场景:

  • 提取字符串中的一部分,例如从邮件主题中提取日期时间。
  • 从字符串中提取特定的代码点,例如从 Emoji 表情中提取指定的表情。

示例

下面给出两个使用 $substrCP 运算符的示例。

示例 1

假设有一个存储了用户信息的集合 user,其中包含了每个用户的名字和姓氏。现在我们需要查询每个用户名字的前两个字符,可以使用以下聚合管道:

db.user.aggregate([
  {
    $project: {
      firstName: { $substrCP: ["$name", 0, 2] }
    }
  }
])

这个聚合管道中,我们首先使用 $project 运算符将集合中的每个文档投影为只包含 firstName 字段的文档。在 $project 运算符中,我们使用 $substrCP 运算符提取名字字段中前两个字符作为 firstName 字段的值。

假设集合中有以下两个文档:

{ "_id": 1, "name": "John Doe" }
{ "_id": 2, "name": "Jane Smith" }

使用上述聚合管道,可以得到以下结果:

{ "_id": 1, "firstName": "Jo" }
{ "_id": 2, "firstName": "Ja" }

示例 2

假设有一个存储了商品信息的集合 product,其中包含了每个商品的名称和价格。现在我们需要查询每个商品名称中从第二个字符开始的前三个字符,可以使用以下聚合管道:

db.product.aggregate([
  {
    $project: {
      namePrefix: { $substrCP: ["$name", 1, 3] }
    }
  }
])

这个聚合管道中,我们同样使用 $project 运算符将集合中的每个文档投影为只包含 namePrefix 字段的文档。在 $project 运算符中,我们使用 $substrCP 运算符提取名字字段中从第二个字符开始的前三个字符作为 namePrefix 字段的值。

假设集合中有以下两个文档:

{ "_id": 1, "name": "Apple iPhone 13", "price": 999 }
{ "_id": 2, "name": "Samsung Galaxy S21", "price": 799 }

使用上述聚合管道,可以得到以下结果:

{ "_id": 1, "namePrefix": "ppl" }
{ "_id": 2, "namePrefix": "ams" }

结论

$substrCP 运算符是 MongoDB 中的一个字符串聚合运算符,用于从字符串中提取子字符串。与 $substrBytes 运算符不同,$substrCP 运算符按照 Unicode 码点来提取子字符串,可以保证对于多字节字符的处理正确无误。在实际的应用场景中,可以根据具体的需求,使用 $substrCP 运算符方便地处理字符串。