$merge
聚合管道中的阶段用于将聚合查询的结果写入指定的集合。 此阶段对于根据聚合操作的结果更新或插入文档到目标集合等任务特别有用。 它通过在单个作中合并数据转换和数据持久性来帮助简化工作流。
语法
{
$merge: {
into: <collection>,
on: <field or fields>,
whenMatched: <action>,
whenNotMatched: <action>
}
}
参数
参数 | DESCRIPTION |
---|---|
into |
指定要在其中写入聚合结果的目标集合。 |
on |
指定用来标识目标集合中匹配文档的字段。 |
whenMatched |
指定找到匹配文档时要执行的操作。 选项包括 merge 、 replace 、 keepExisting 或 fail 自定义管道。 |
whenNotMatched |
在未找到匹配文档时指定要执行的操作。 选项包括 insert 或 discard 。 |
例子
请考虑商店集合中的这个示例文档。
{
"_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
"name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
"location": {
"lat": 60.1441,
"lon": -141.5012
},
"staff": {
"totalStaff": {
"fullTime": 2,
"partTime": 0
}
},
"sales": {
"salesByCategory": [
{
"categoryName": "DJ Headphones",
"totalSales": 35921
}
],
"fullSales": 3700
},
"promotionEvents": [
{
"eventName": "Bargain Blitz Days",
"promotionalDates": {
"startDate": {
"Year": 2024,
"Month": 3,
"Day": 11
},
"endDate": {
"Year": 2024,
"Month": 2,
"Day": 18
}
},
"discounts": [
{
"categoryName": "DJ Turntables",
"discountPercentage": 18
},
{
"categoryName": "DJ Mixers",
"discountPercentage": 15
}
]
}
],
"tag": [
"#ShopLocal",
"#SeasonalSale",
"#FreeShipping",
"#MembershipDeals"
]
}
示例 1:将数据合并到集合中
此查询聚合文档并将结果写入名为 salesSummary
的集合,更新匹配项的现有文档并插入新文档 _id
。
db.sales.aggregate([
{
$group: {
_id: "$sales.salesByCategory.categoryName",
totalSales: { $sum: "$sales.salesByCategory.totalSales" }
}
},
{
$merge: {
into: "salesSummary",
on: "_id",
whenMatched: "merge",
whenNotMatched: "insert"
}
}
])
示例 2:替换目标集合中的文档
本示例基于promotionEventsSummary
字段替换集合中的_id
文档。
db.promotionEvents.aggregate([
{
$project: {
_id: "$eventName",
startDate: "$promotionalDates.startDate",
endDate: "$promotionalDates.endDate",
totalDiscounts: { $size: "$discounts" }
}
},
{
$merge: {
into: "promotionEventsSummary",
on: "_id",
whenMatched: "replace",
whenNotMatched: "insert"
}
}
])
相关内容
- 查看有关 从 MongoDB 迁移到适用于 MongoDB 的 Azure Cosmos DB (vCore) 的选项。
- 详细了解 与 MongoDB 的功能兼容性。