$mergeObjects (aggregation)

在本页面

Definition

  • $mergeObjects
    • 3.6 版的新功能。

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

{ $mergeObjects: <document> }
  • 在其他表达式中使用时,包括在$group阶段,但不用作累加器时:
{ $mergeObjects: [ <document1>, <document2>, ... ] }

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

Behavior

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

  • mergeObjects在合并文档时覆盖字段值。如果要合并的文档包含相同的字段名称,则结果文档中的字段具有上次为该字段合并的文档中的值。

ExampleResults
{ $mergeObjects: [ { a: 1 }, null ] }{ a: 1 }
{ $mergeObjects: [ null, null ] }{ }
{


$mergeObjects: [
{ a: 1 },
{ a: 2, b: 2 },
{ a: 3, c: 3 }
br]
}|{ a: 3, b: 2, c: 3 }|
|{
$mergeObjects: [
{ a: 1 },
{ a: 2, b: 2 },
{ a: 3, b: null, c: 3 }
br]
}|{ a: 3, b: null, c: 3 }|

Examples

$mergeObjects

创建包含以下文档的集合orders

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

使用以下文档创建另一个集合items

db.items.insert([
  { "_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 }

$ mergeObjects 作为累加器

创建包含以下文档的集合sales

db.sales.insert( [
   { _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 } }
] )

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

Note

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

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

该操作返回以下文档:

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

Note

如果要合并的文档包含相同的字段名称,则结果文档中的字段具有该字段上次合并的文档中的值。