$replaceRoot
¶3.4版的新功能。
用指定的文档替换输入的文档。该操作将替换输入文档中的所有现有字段,包括该_id
字段。您可以将现有的嵌入式文档升级到顶层,也可以创建一个新的文档进行升级(请参阅
示例)。
注意
从4.2版开始,MongoDB添加了一个新的聚合管道阶段$replaceWith
,该阶段是的别名
$replaceRoot
。
该$replaceRoot
阶段具有以下形式:
替换文档可以是解析为文档的任何有效表达式。如果<replacementDocument>
不是文档,阶段会出错并失败。有关表达式的更多信息,请参见表达式。
如果<replacementDocument>
不是文档,则会
$replaceRoot
出错并失败。
如果<replacementDocument>
解析为丢失的文档(即该文档不存在),$replaceRoot
则会出错并失败。例如,使用以下文档创建一个集合:
然后,以下$replaceRoot
操作将失败,因为其中一个文档没有该name
字段:
为了避免该错误,您可以使用$mergeObjects
将该name
文档合并到某些默认文档中。例如:
或者,您可以name
通过包含一个$match
阶段来跳过缺少该字段的文档,以在将文档传递到该$replaceRoot
阶段之前检查文档字段的存在:
或者,您可以使用$ifNull
表达式将其他一些文档指定为root。例如:
$replaceRoot
带有嵌入式文档字段¶名为的集合people
包含以下文档:
以下操作使用该$replaceRoot
阶段用$mergeObjects
操作结果替换每个输入文档
。该$mergeObjects
表达式将指定的默认文档与pets
文档合并。
该操作返回以下结果:
$replaceRoot
带有一个新创建的文档¶您还可以在$replaceRoot
阶段中创建新文档,
并使用它们替换所有其他字段。
名为的集合contacts
包含以下文档:
以下操作从first_name
和last_name
字段中创建一个新文档
。
该操作返回以下结果:
$replaceRoot
从中创建新文档$$ROOT
和默认文档¶创建一个contacts
使用以下文档命名的集合:
以下操作使用$replaceRoot
with
$mergeObjects
输出缺少字段的默认值的当前文档:
聚合返回以下文档: