$replaceWith
¶4.2版中的新功能。
用指定的文档替换输入的文档。该操作将替换输入文档中的所有现有字段,包括该_id
字段。使用$replaceWith
,您可以将嵌入式文档提升到顶层。您也可以指定一个新文档作为替换。
该$replaceWith
是一个别名
$replaceRoot
。
该$replaceWith
阶段具有以下形式:
如果<replacementDocument>
不是文档,则会
$replaceWith
出错并失败。
如果<replacementDocument>
解析为丢失的文档(即该文档不存在),$replaceWith
则会出错并失败。例如,使用以下文档创建一个集合:
然后,以下$replaceWith
操作将失败,因为其中一个文档没有该name
字段:
为了避免该错误,您可以使用$mergeObjects
合并 name
文档和一些默认文档。例如:
或者,您可以name
通过包含一个$match
阶段来跳过缺少该字段的文档,以在将文档传递到该$replaceWith
阶段之前检查文档字段的存在:
或者,您可以使用$ifNull
表达式将其他一些文档指定为root。例如:
$replaceWith
嵌入式文档字段¶创建一个people
使用以下文档命名的集合:
以下操作使用该$replaceWith
阶段用$mergeObjects
操作结果替换每个输入文档
。该$mergeObjects
表达式将指定的默认文档与pets
文档合并。
该操作返回以下结果:
$replaceWith
新创建的文档¶sales
包含以下文档的示例集合:
假设出于报告目的,您要为每个已完成的销售计算截至当前报告运行时的总金额。以下操作查找具有状态的所有销售C
并使用该$replaceWith
阶段创建新凭证。在
$replaceWith
计算总金额以及用途变量NOW
来获得当前的时间。
该操作返回以下文档:
一个示例集合reportedsales
将按季度和地区填充报告的销售信息:
假设出于报告目的,您希望按季度查看报告的销售数据;例如
要查看按季度分组的数据,可以使用以下聚合管道:
该$addFields
阶段将添加一个新的obj
文档字段,该字段将键定义k
为区域值,并将该值定义为该区域v
的数量。例如:
将$group
在本季度和使用阶段的群体
$push
中积累的obj
领域进入一个新的
items
数组字段。例如:
该$project
阶段用于$concatArrays
创建一个items2
包含_id
信息和该items
数组中的元素的新数组:
的$replaceWith
用途
$arrayToObject
来转换items2
成一个文件,使用指定的键k
和值v
对,并输出该文件到下一个阶段。例如:
聚合返回以下文档:
$replaceWith
创建的新文档$$ROOT
和默认文档¶创建一个contacts
使用以下文档命名的集合:
以下操作使用$replaceWith
with
$mergeObjects
输出缺少字段的默认值的当前文档:
聚合返回以下文档: