对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

$mergeObjects(窗口函数)

$mergeObjects

8.3版本新增。

返回通过合并窗口中的输入文档所创建的文档。

注意

消歧

本页介绍了用作窗口函数的 $mergeObjects。

您还可以在其他上下文中使用 $mergeObjects:

{
$setWindowFields: {
output: {
<outputField>: {
$mergeObjects: <document>,
window: {
<documents|range>: [ "unbounded", <upper> ]
}
}
}
}
}

注意

当窗口上边界为 "unbounded" 或省略 window 时,$setWindowFields 中的 sortBy 选项是可选的。当窗口上边界不是 "unbounded" 时,需要 sortBy,例如 "current"。

如果省略 sortBy,则不保证 $mergeObjects 解决冲突字段名称的顺序。

字段
类型
必要性
说明

<document>

表达式(expression)

必需

计算结果为文档的字段名或表达式。 $percentile 合并窗口中所有文档的文档值。

window

文档

Optional

指定 $percentile 操作所在的文档窗口。下限必须为 "unbounded"。如果省略,窗口包括分区中的所有文档。

$mergeObjects 只支持不可移动的窗口,即下限为 "unbounded"。如果指定下限不是 "unbounded" 的窗口,则操作将返回错误。

$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 升序对最终结果进行排序。

给本页内容打分