Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

$mergeObjects(聚合)

在此页面上

  • 定义
  • 语法
  • 行为
  • 示例
$mergeObjects

将多个文档合并为一个文档。

$mergeObjects 可在以下阶段使用:

  • $bucket

  • $bucketAuto

  • $group

在用作 $bucket$bucketAuto$group 阶段累加器时,$mergeObjects 的语法如下:

{ $mergeObjects: <document> }

在其他表达式(包括在 $bucket$bucketAuto$group 阶段)中使用但未用作累加器时,$mergeObjects 采用以下语法:

{ $mergeObjects: [ <document1>, <document2>, ... ] }

<document> 可以是任何解析为文档的有效表达式

$mergeObjects 忽略 null 操作数。如果 $mergeObjects 的所有操作数都解析为空值,$mergeObjects 将返回空文档 { }

$mergeObjects 会在合并这些文档时覆盖字段值。如果要合并的文档包含相同的字段名称,则生成的文档中的字段将具有该字段合并的最后一个文档中的值。

例子
结果
{ $mergeObjects: [ { a: 1 }, null ] }
{ a: 1 }
{ $mergeObjects: [ null, null ] }
{ }
{
$mergeObjects: [
{ a: 1 },
{ a: 2, b: 2 },
{ a: 3, c: 3 }
]
}
{ a: 3, b: 2, c: 3 }
{
$mergeObjects: [
{ a: 1 },
{ a: 2, b: 2 },
{ a: 3, b: null, c: 3 }
]
}
{ a: 3, b: null, c: 3 }

使用以下文档创建集合 orders

db.orders.insertMany( [
{ "_id" : 1, "item" : "abc", "price" : 12, "ordered" : 2 },
{ "_id" : 2, "item" : "jkl", "price" : 20, "ordered" : 1 }
] )

再创建一个包含以下文档的集合 items

db.items.insertMany( [
{ "_id" : 1, "item" : "abc", description: "product 1", "instock" : 120 },
{ "_id" : 2, "item" : "def", description: "product 2", "instock" : 80 },
{ "_id" : 3, "item" : "jkl", description: "product 3", "instock" : 60 }
] )

以下操作首先使用 $lookup 阶段按照 item 字段联接两个集合,然后使用 $replaceRoot 中的 $mergeObjects 合并来自 itemsorders 中的联接文档:

db.orders.aggregate( [
{
$lookup: {
from: "items",
localField: "item", // field in the orders collection
foreignField: "item", // field in the items collection
as: "fromItems"
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$fromItems", 0 ] }, "$$ROOT" ] } }
},
{ $project: { fromItems: 0 } }
] )

该操作将返回以下文档:

{
_id: 1,
item: 'abc',
description: 'product 1',
instock: 120,
price: 12,
ordered: 2
},
{
_id: 2,
item: 'jkl',
description: 'product 3',
instock: 60,
price: 20,
ordered: 1
}

使用以下文档创建集合 sales

db.sales.insertMany( [
{ _id: 1, year: 2017, item: "A", quantity: { "2017Q1": 500, "2017Q2": 500 } },
{ _id: 2, year: 2016, item: "A", quantity: { "2016Q1": 400, "2016Q2": 300, "2016Q3": 0, "2016Q4": 0 } } ,
{ _id: 3, year: 2017, item: "B", quantity: { "2017Q1": 300 } },
{ _id: 4, year: 2016, item: "B", quantity: { "2016Q3": 100, "2016Q4": 250 } }
] )

以下操作在 $group 使用 $mergeObjects 作为累加器,按 item 字段对文档进行分组:

注意

当用作累加器时,$mergeObjects 操作符将接受单个操作数。

db.sales.aggregate( [
{ $group: { _id: "$item", mergedSales: { $mergeObjects: "$quantity" } } }
] )

该操作将返回以下文档:

{
_id: 'A',
mergedSales: { '2017Q1': 500, '2017Q2': 500, '2016Q1': 400, '2016Q2': 300, '2016Q3': 0, '2016Q4': 0 }
},
{
_id: 'B',
mergedSales: { '2017Q1': 300, '2016Q3': 100, '2016Q4': 250 }
}

注意

如果要合并的文档包含相同的字段名称,则生成的文档中的该字段将包含合并的最后一个文档中的对应字段值。

后退

$maxN-array-element