$replaceOne(聚合)
定义
$replaceOne
用替换字符串替换输入字符串中搜索字符串的第一个实例。
如果未找到匹配项,则
$replaceOne
的计算结果为输入string 。$replaceOne
区分大小写,区分变音符号,忽略集合上存在的任何排序规则。
语法
$replaceOne
操作符采用以下操作符表达式语法:
{ $replaceOne: { input: <expression>, find: <expression>, replacement: <expression> } }
Operator 徽标
行为
如果在 input 中找不到 find,则 $replaceOne
的计算结果为输入字符串。
input、find 和 replacement 表达式的计算结果必须为字符串或 null
,否则 $replaceOne
会失败并出现错误。
$replaceOne
和空值
如果 input 或 find 引用的字段缺失,则返回 null
。
如果 input、find 或 replacement 中的任何一个 计算结果为null
,则整个 $replaceOne
表达式的计算结果为 null
:
例子 | 结果 |
---|---|
{ $replaceOne: { input: null, find: "abc", replacement: "ABC" } } | null |
{ $replaceOne: { input: "abc", find: null, replacement: "ABC" } } | null |
{ $replaceOne: { input: "abc", find: "abc", replacement: null } } | null |
$replaceOne
和排序规则
所有 $replaceOne
表达式的字符串匹配始终区分大小写且区分变音符号。使用 $replaceOne
进行字符串比较时,任何配置的排序规则都将被忽略。
例如,创建一个排序规则强度为 1
的样本集合:
db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )
排序规则强度 1
仅比较基本字符并忽略其他差异,例如大小写和变音符号。
接下来,插入三个示例文档:
db.myColl.insertMany([ { _id: 1, name: "cafe" }, { _id: 2, name: "Cafe" }, { _id: 3, name: "café" } ])
以下 $replaceOne
操作尝试在 name
字段中查找并替换 "Cafe" 的第一个实例:
db.myColl.aggregate([ { $addFields: { resultObject: { $replaceOne: { input: "$name", find: "Cafe", replacement: "CAFE" } } } } ])
由于 $replaceOne
忽略为此集合配置的排序规则,因此该操作仅与文档 2
中的“Cafe”实例匹配:
{ "_id" : 1, "name" : "cafe", "resultObject" : "cafe" } { "_id" : 2, "name" : "Cafe", "resultObject" : "CAFE" } { "_id" : 3, "name" : "café", "resultObject" : "café" }
由于该集合的排序规则强度为1
,因此遵循排序规则的操作符(例如 $match
)在与“Cafe”进行字符串比较时将匹配所有三个文档。
$replaceOne
与 Unicode 规范化
$replaceOne
聚合表达式不执行任何 unicode 规范化。这意味着在尝试匹配时,所有 $replaceOne
表达式的字符串匹配都将考虑 unicode 中用于表示字符的码点数量。
例如,字符é
可以使用一个或两个代码点以 unicode 表示:
Unicode | 显示为 | 代码点 |
---|---|---|
\xe9 | é | 1 ( \xe9 ) |
e\u0301 | é | 2 ( e + \u0301 ) |
将 $replaceOne
与 find 字符串一起使用,其中字符 é
用 unicode 中的一个代码点表示,将不匹配在 input 字符串中使用两个代码点的任何 é
实例。
下表显示了 find 字符串 "café" 与 input 字符串进行比较时是否会出现匹配情况,其中 é
由一个或两个代码点表示。本例中的 find 字符串使用一个代码点来表示 é
字符:
例子 | 匹配 |
---|---|
{ $replaceOne: { input: "caf\xe9", find: "café", replacement: "CAFE" } } | 是 |
{ $replaceOne: { input: "cafe\u0301", find: "café", replacement: "CAFE" } } | no |
由于 $replaceOne
不执行任何 Unicode 规范化,因此只有第一个字符串比较是匹配项,其中 find 和 input 字符串都使用一个码位来表示 é
。
例子
使用以下文档创建 inventory
集合:
db.inventory.insertMany([ { "_id" : 1, "item" : "blue paint" }, { "_id" : 2, "item" : "blue and green paint" }, { "_id" : 3, "item" : "blue paint with blue paintbrush" }, { "_id" : 4, "item" : "blue paint with green paintbrush" }, ])
以下示例将 item
字段中“blue paint”的第一个实例替换为“red paint”:
db.inventory.aggregate([ { $project: { item: { $replaceOne: { input: "$item", find: "blue paint", replacement: "red paint" } } } } ])
操作返回以下结果:
{ "_id" : 1, "item" : "red paint" } { "_id" : 2, "item" : "blue and green paint" } { "_id" : 3, "item" : "red paint with blue paintbrush" } { "_id" : 4, "item" : "red paint with green paintbrush" }
请注意,对于文档 3
,仅替换第一个匹配的“bluepaint”实例。