$mergeObjects (aggregation)

On this page本页内容

Definition定义

$mergeObjects

New in version 3.6.版本3.6中的新功能。

Combines multiple documents into a single document.将多个文档合并为一个文档。

  • When used as a $group stage accumulator, $mergeObjects has the following form:当用作$group阶段累加器时,$mergeObjects具有以下形式:

    { $mergeObjects: <document> }
  • When used in other expressions, including in the $group stage but not as an accumulator:在其他表达式中使用时,包括在$group阶段,但不作为累加器使用:

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

The <document> can be any valid expression that resolves to a document.<document>可以是解析为文档的任何有效表达式

Behavior行为

Example示例Results结果
{ $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 }

Examples示例

$mergeObjects

Create a collection orders with the following documents:使用以下文档创建集合orders

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

Create another collection items with the following documents:使用以下文档创建另一个集合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 }
])

The following operation first uses the $lookup stage to join the two collections by the item fields and then uses $mergeObjects in the $replaceRoot to merge the joined documents from items and orders:以下操作首先使用$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 } }
])

The operation returns the following documents:该操作将返回以下文档:

{ "_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 as an Accumulator作为累加器

Create a collection sales with the following documents:使用以下文档创建集合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 } }
] )

The following operation uses $mergeObjects as a accumulator in a $group stage that groups documents by the item field:以下操作将$mergeObjects用作$group阶段中的累加器,该阶段按item字段对文档进行分组:

Note

When used as an accumulator, $mergeObjects operator accepts a single operand.当用作累加器时,$mergeObjects运算符接受单个操作数。

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

The operation returns the following documents:该操作将返回以下文档:

{ "_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

If the documents to merge include the same field name, the field in the resulting document has the value from the last document merged for the field.如果要合并的文档包含相同的字段名,则结果文档中的字段具有该字段上一个合并文档的值。