$replaceAll (aggregation)

On this page本页内容

Definition定义

$replaceAll

New in version 4.4.在版本4.4中新增

Replaces all instances of a search string in an input string with a replacement string.用替换字符串替换输入字符串中搜索字符串的所有实例。

$replaceAll is both case-sensitive and diacritic-sensitive, and ignores any collation present on a collection.区分大小写和音调符号,并忽略集合中存在的任何排序规则。

Syntax语法

The $replaceAll operator has the following operator expression syntax:$replaceAll运算符具有以下运算符表达式语法

{ $replaceAll: { input: <expression>, find: <expression>, replacement: <expression> } }

Operator Fields运算符字段

Field字段Description描述
input

The string on which you wish to apply the find. 要应用find的字符串。Can be any valid expression that resolves to a string or a null. 可以是解析为字符串或null的任何有效表达式If input refers to a field that is missing, $replaceAll returns null.如果input引用的字段缺失,$replaceAll将返回null

find

The string to search for within the given input. 要在给定input中搜索的字符串。Can be any valid expression that resolves to a string or a null. 可以是解析为字符串或null的任何有效表达式If find refers to a field that is missing, $replaceAll returns null.如果find引用的字段缺失,$replaceAll将返回null

replacement

The string to use to replace all matched instances of find in input. 用于替换input中所有匹配的find实例的字符串。Can be any valid expression that resolves to a string or a null.可以是解析为字符串或null的任何有效表达式

Behavior行为

The input, find, and replacement expressions must evaluate to a string or a null, or $replaceAll fails with an error.inputfindreplacement表达式的计算结果必须为字符串或null,否则$replaceAll将失败并返回错误。

$replaceAll and Null Values和空值

If input or find refer to a field that is missing, they return null.如果inputfind引用的字段缺失,则返回null

If any one of input, find, or replacement evaluates to a null, the entire $replaceAll expression evaluates to null:如果input replacement中的任何一个计算结果为null,则整个$replaceAll表达式的计算结果为null

Example示例Result后果
{ $replaceAll: { input: null, find: "abc", replacement: "ABC" } }null
{ $replaceAll: { input: "abc", find: null, replacement: "ABC" } }null
{ $replaceAll: { input: "abc", find: "abc", replacement: null } }null

$replaceAll and Collation和排序规则

String matching for all $replaceAll expressions is always case-sensitive and diacritic-sensitive. 所有$replaceAll表达式的字符串匹配始终区分大小写和音调符号。Any collation configured on a collection, db.collection.aggregate(), or index is ignored when performing string comparisons with $replaceAll.$replaceAll进行字符串比较时,将忽略在集合、db.collection.aggregate()或索引上配置的任何排序规则

For example, create a sample collection with collation strength 1:例如,创建排序强度为1的样本集合:

db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )

A collation strength of 1 compares base character only and ignores other differences such as case and diacritics.排序强度为1时,仅比较基本字符,并忽略其他差异,如大小写和音调符号。

Next, insert three example documents:接下来,插入三个示例文档:

db.myColl.insertMany([
   { _id: 1, name: "cafe" },
   { _id: 2, name: "Cafe" },
   { _id: 3, name: "café" }
])

The following $replaceAll operation tries to find and replace all instances of "Cafe" in the name field:以下$replaceAll操作尝试查找并替换name字段中的所有“Cafe”实例:

db.myColl.aggregate([
  {
    $addFields:
      {
        resultObject: { $replaceAll: { input: "$name", find: "Cafe", replacement: "CAFE" } }
      }
  }
])

Because $replaceAll ignores the collation configured for this collection, the operation only matches the instance of "Cafe" in document 2:由于$replaceAll忽略为此集合配置的排序规则,因此该操作仅匹配文档2中的“Cafe”实例:

{ "_id" : 1, "name" : "cafe", "resultObject" : "cafe" }
{ "_id" : 2, "name" : "Cafe", "resultObject" : "CAFE" }
{ "_id" : 3, "name" : "café", "resultObject" : "café" }

Operators which respect collation, such as $match, would match all three documents when performing a string comparison against "Cafe" due to this collection's collation strength of 1.尊重排序规则的运算符(例如$match)将在与“Cafe”进行字符串比较时匹配所有三个文档,因为该集合的排序规则强度为1。

$replaceAll and Unicode Normalization和Unicode规范化

The $replaceAll aggregation expression does not perform any unicode normalization. $replaceAll聚合表达式不执行任何unicode规范化。This means that string matching for all $replaceAll expressions will consider the number of code points used to represent a character in unicode when attempting a match.这意味着在尝试匹配时,匹配所有$replaceAll表达式的字符串将考虑用于在unicode中表示字符的代码点数。

For example, the character é can be represented in unicode using either one code point or two:例如,可以使用一个或两个代码点在unicode中表示字符é

UnicodeDisplays as显示为Code points代码点
\xe9é1 ( \xe9 )
e\u0301é2 ( e + \u0301 )

Using $replaceAll with a find string where the character é is represented in unicode with one code point will not match any instance of é that uses two code points in the input string.如果使用$replaceAll配合find字符串,其中字符é在具有一个代码点的unicode中表示,则不会与在input字符串中使用两个代码点时的任何实例相匹配。

The following table shows whether a match occurs for a find string of "café" when compared to input strings where é is represented by either one code point or two. 下表显示了与由一个或两个代码点表示éinput字符串相比,find字符串“café”是否匹配。The find string in this example uses one code point to represent the é character:本例中的find字符串使用一个代码点表示字符:

Example示例Match匹配
{ $replaceAll: { input: "caf\xe9", find: "café", replacement: "CAFE" } }yes
{ $replaceAll: { input: "cafe\u0301", find: "café", replacement: "CAFE" } }no

Because $replaceAll does not perform any unicode normalization, only the first string comparison matches, where both the find and input strings use one code point to represent é.因为$replaceAll不执行任何unicode规范化,所以只有第一个字符串比较匹配,其中find字符串和input字符串都使用一个代码点来表示é

Example示例

Create an inventory collection with the following documents:使用以下文档创建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" },
])

The following example replaces each instance of "blue paint" in the item field with "red paint":以下示例将item字段中的每个“蓝色绘制”实例替换为“红色绘制”:

db.inventory.aggregate([
   {
     $project:
      {
         item: { $replaceAll: { input: "$item", find: "blue paint", replacement: "red paint" } }
      }
   }
])

The operation returns the following results:该操作返回以下结果:

{ "_id" : 1, "item" : "red paint" }
{ "_id" : 2, "item" : "blue and green paint" }
{ "_id" : 3, "item" : "red paint with red paintbrush" }
{ "_id" : 4, "item" : "red paint with green paintbrush" }
←  $replaceOne (aggregation)$reverseArray (aggregation) →