定义
返回通过合并窗口中的输入文档所创建的文档。
注意
消歧
本页介绍了用作窗口函数的 $mergeObjects。
您还可以在其他上下文中使用 $mergeObjects:
$mergeObjects (accumulator),返回一群组输入文档的合并文档。$mergeObjects (expression),它将一大量文档合并为一个文档。
语法
{ $setWindowFields: { output: { <outputField>: { $mergeObjects: <document>, window: { <documents|range>: [ "unbounded", <upper> ] } } } } }
注意
当窗口上边界为 "unbounded" 或省略 window 时,$setWindowFields 中的 sortBy 选项是可选的。当窗口上边界不是 "unbounded" 时,需要 sortBy,例如 "current"。
如果省略 sortBy,则不保证 $mergeObjects 解决冲突字段名称的顺序。
命令字段
字段 | 类型 | 必要性 | 说明 |
|---|---|---|---|
| 表达式(expression) | 必需 | 计算结果为文档的字段名或表达式。 |
| 文档 | Optional | 指定 |
行为
不可拆卸的Windows
$mergeObjects 只支持不可移动的窗口,即下限为 "unbounded"。如果指定下限不是 "unbounded" 的窗口,则操作将返回错误。
Null 输入处理
$mergeObjects 忽略 null 输入值。如果所有输入值为 null,则 $mergeObjects 返回空文档{ }。
字段覆盖行为
$mergeObjects 在合并文档时覆盖字段值。如果多个输入文档包含相同的字段名称,则输出包含包含冲突字段的最后一个输入文档的值。
例子
创建一个 productUpdates 集合:
db.productUpdates.insertMany( [ { _id: 1, product: "gadget", date: ISODate("2024-01-01"), specs: { color: "blue" } }, { _id: 2, product: "gadget", date: ISODate("2024-01-02"), specs: { size: "medium" } }, { _id: 3, product: "gadget", date: ISODate("2024-01-03"), specs: { weight: 0.5 } }, { _id: 4, product: "widget", date: ISODate("2024-01-01"), specs: { color: "red" } }, { _id: 5, product: "widget", date: ISODate("2024-01-02"), specs: { material: "plastic" } } ] )
每个文档都代表一个添加新规范字段的产品更新。由于每次更新都会向 specs 子文档贡献不同的字段名称,因此 $mergeObjects 可以随着窗口的扩展而累积完整的规范配置文件。
以下管道使用 $setWindowFields 中的 $mergeObjects 返回产品规格列表,该列表会在窗口中添加新规格时累积更新。对于每个文档,cumulativeSpecs 包含所有更新(包括当前文档)的合并规范:
db.productUpdates.aggregate( [ { $setWindowFields: { partitionBy: "$product", sortBy: { date: 1 }, output: { cumulativeSpecs: { $mergeObjects: "$specs", window: { documents: [ "unbounded", "current" ] } } } } }, { $sort: { product: 1, date: 1 } }, { $project: { _id: 0, product: 1, date: 1, specs: 1, cumulativeSpecs: 1 } } ] )
在前面的管道中:
$setWindowFields按product对文档进行分区,并按date升序进行排序。$mergeObjects使用unbounded到current窗口合并从每个分区的开头到当前文档的所有specs文档,生成运行累积规范。$sort按product和date升序对最终结果进行排序。