MongoDB聚合:$merge 阶段(2)

本文围绕MongoDB聚合管道将结果写入指定集合的用途展开,给出多个例子。包括按需物化视图创建集合、更新/替换数据、只新增数据,还介绍了合并多个集合结果、使用管道定制合并以及使用变量自定义合并等操作,涉及不同场景下的操作步骤和注意事项。

$merge的用途是把聚合管道产生的结果写入指定的集合,有时候可以用$merge来做物化视图。下面是$merge的一些例子。

举例

按需物化视图:创建集合

当输出集合不存在时,$merge将自动创建。首先在zoo数据库的salaries集合中填充员工和部门历史数据:

db.getSiblingDB("zoo").salaries.insertMany([
   {
   
    "_id" : 1, employee: "Ant", dept: "A", salary: 100000, fiscal_year: 2017 },
   {
   
    "_id" : 2, employee: "Bee", dept: "A", salary: 120000, fiscal_year: 2017 },
   {
   
    "_id" : 3, employee: "Cat", dept: "Z", salary: 115000, fiscal_year: 2017 },
   {
   
    "_id" : 4, employee: "Ant", dept: "A", salary: 115000, fiscal_year: 2018 },
   {
   
    "_id" : 5, employee: "Bee", dept: "Z", salary: 145000, fiscal_year: 2018 },
   {
   
    "_id" : 6, employee: "Cat", dept: "Z", salary: 135000, fiscal_year: 2018 },
   {
   
    "_id" : 7, employee: "Gecko", dept: "A", salary: 100000, fiscal_year: 2018 },
   {
   
    "_id" : 8, employee: "Ant", dept: "A", salary: 125000, fiscal_year: 2019 },
   {
   
    "_id" : 9, employee: "Bee", dept: "Z", salary: 160000, fiscal_year: 2019 },
   {
   
    "_id" : 10, employee: "Cat", dept: "Z", salary: 150000, fiscal_year: 2019 }
])

然后,使用$group$merge管道阶段,在reporting数据库中创建一个名为budgets的集合。

注意:

  • 对于复制集或标准部署的情况,如果输出数据库不存在会自动创建数据库
  • 对于分片集群部署的情况,要求输出指定的数据库必须已经存在。
db.getSiblingDB("zoo").salaries.aggregate( [
   {
   
    $group: {
   
    _id: {
   
    fiscal_year: "$fiscal_year", dept: "$dept" }, salaries: {
   
    $sum: "$salary" } } },
   {
   
    $merge : {
   
    into: {
   
    db: "reporting", coll: "budgets" }, on: "_id",  whenMatched: "replace", whenNotMatched: "insert" } }
] )
  • $group阶段根据fiscal_yeardept对salaries进行分组
  • $merge阶段将$group阶段处理的结果输出到reporting数据库的budgets集合。

此时,budegets将包含下面的文档:

{
   
    "_id" : {
   
    "fiscal_year" : 2017, "dept" : "A" }, "salaries" : 220000 }
{
   
    "_id" : {
   
    "fiscal_year" : 2017, "dept" : "Z" }, "salaries" : 115000 }
{
   
    "_id" : {
   
    "fiscal_year" : 2018, "dept" : "A" }, "salaries" : 215000 }
{
   
    "_id" : {
   
    "fiscal_year" : 2018, "dept" : "Z" }, "salaries" : 280000 }
{
   
    "_id" : {
   
    "fiscal_year" : 2019, "dept" : "A" }, "salaries" : 125000 }
{
   
    "_id" : {
   
    "fiscal_year" : 2019, "dept" : "Z" }, "salaries" : 310000 }

按需物化视图:更新/替换数据

下面的例子继续使用上面例子的数据,salaries集合包含了员工薪酬和部门的历史数据:

{
   
    "_id" : 1, "employee": "Ant", "dept": "A", "salary": 100000, "fiscal_year": 2017 },
{
   
    "_id" : 2, "employee": "Bee", "dept": "A", "salary": 120000, "fiscal_year": 2017 },
{
   
    "_id" : 3, "employee": "Cat", "dept": "Z", "salary": 115000, "fiscal_year": 2017 },
{
   
    "_id" : 4, "employee": "Ant", "dept": "A", "salary": 115000, "fiscal_year": 2018 },
{
   
    "_id" : 5, "employee": "Bee", "dept": "Z", "salary": 145000, "fiscal_year": 2018 },
{
   
    "_id" : 6, "employee": "Cat", "dept": "Z", "salary": 135000, "fiscal_year": 2018 },
{
   
    "_id" : 7, "employee": "Gecko", "dept": "A", "salary": 100000, "fiscal_year": 2018 },
{
   
    "_id" : 8, "employee": "Ant", "dept": "A", "salary": 125000, "fiscal_year": 2019 },
{
   
    "_id" : 9, "employee": "Bee", "dept": "Z", "salary": 160000, "fiscal_year": 2019 },
{
   
    "_id" : 10, "employee": "Cat", "dept": "Z", "salary": 150000, "fiscal_year": 2019 }

budgets集合包含了年度累计预算:

{
   
    "_id" : {
   
    "fiscal_year" : 2017, "dept" : "A" }, "salaries"</
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值