定义
返回通过组合每个组的输入文档创建的文档。
$mergeObjects 累加器可在以下阶段使用:
注意
消歧
本页介绍了 $mergeObjects 用作 累加器 时的情况。累加器返回跨一组输入文档的聚合值。
您还可以在这些其他上下文中使用 $mergeObjects:
$mergeObjects (expression),将一个文档数组合并为单个文档。$mergeObjects (window function),用于在$setWindowFields阶段返回来自窗口中的文档的合并文档。
语法
{ $mergeObjects: <expression> }
<expression> 可以是任何评估为文档的有效表达式。
行为
$mergeObjects 忽略 null 输入值。如果所有输入值都是 null,$mergeObjects 将返回一个空文档 { }。
$mergeObjects 会在合并文档时覆盖字段值。如果多个输入文档包含相同的字段名,输出包含来自 最后一个包含冲突字段的输入文档的值。
例子
创建一个 movieReviews 集合:
db.movieReviews.insertMany( [ { title: "Galactic Odyssey", source: "filmCritic", data: { rating: 8.1, votes: 1482903 } }, { title: "Galactic Odyssey", source: "viewerVault", data: { tomatometer: 79, audienceScore: 85 } }, { title: "Neon Horizon", source: "filmCritic", data: { rating: 7.4, votes: 983201 } }, { title: "Neon Horizon", source: "viewerVault", data: { tomatometer: 68, audienceScore: 74 } }, { title: "The Last Protocol", source: "filmCritic", data: { rating: 8.7, votes: 2104567 } }, { title: "The Last Protocol", source: "viewerVault", data: { tomatometer: 91, audienceScore: 88 } } ] )
每部电影都有两个文档:
来自 filmCritic 的一个,具有
rating和votes字段。来自 viewerVault 的一个,带有
tomatometer和audienceScore字段。
因为两个源文档具有不同的字段名称,$mergeObjects 可以将它们组合成为一个完整的资料,其中包含所有四个字段。
以下管道在 $group 阶段中使用 $mergeObjects 将来自每个源的查看数据组合成为每部电影的单个文档:
db.movieReviews.aggregate( [ { $group: { _id: "$title", allRatings: { $mergeObjects: "$data" } } }, { $sort: { _id: 1 } } ] )
在前面的管道中: