On this page
$mergeObjects (aggregation)
在本页面
Definition
$mergeObjects
- 3.6 版的新功能。
将多个文档合并为一个文档。
- 用作$group级累加器时,$mergeObjects具有以下形式:
{ $mergeObjects: <document> }
- 在其他表达式中使用时,包括在$group阶段,但不用作累加器时:
{ $mergeObjects: [ <document1>, <document2>, ... ] }
<document>
可以是任何可解析为文档的有效expression。
Behavior
mergeObjects
忽略null
个操作数。如果mergeObjects
的所有操作数都解析为 null,则mergeObjects
返回空文档{ }
。mergeObjects
在合并文档时覆盖字段值。如果要合并的文档包含相同的字段名称,则结果文档中的字段具有上次为该字段合并的文档中的值。
Example | Results |
---|---|
{ $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合并来自items
和orders
的合并文档:
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
如果要合并的文档包含相同的字段名称,则结果文档中的字段具有该字段上次合并的文档中的值。