$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使用以下文档命名的集合:
以下操作使用$replaceRootwith
$mergeObjects输出缺少字段的默认值的当前文档:
聚合返回以下文档: