相关文章推荐
健壮的李子  ·  广东省建设工程监理条例 广东省人民政府门户网站·  1 月前    · 
深情的绿茶  ·  中国人民银行对十三届全国人大三次会议第875 ...·  1 月前    · 
微笑的饼干  ·  “童年神片”归来:《天书奇谭》背后有哪些历史传说?·  5 月前    · 
体贴的路灯  ·  云学堂_百度百科·  11 月前    · 
英俊的小马驹  ·  红楼梦:荣国府有两大主要矛盾,分别与王熙凤和 ...·  11 月前    · 
小百科  ›  MongoDB系列8:MongoDB集合的增量更新开发者社区
增量更新 云数据 大数据 增量更新 mongodb
开朗的书包
1 年前
大数据和云计算技术

MongoDB系列8:MongoDB集合的增量更新

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
发布
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
大数据和云计算技术
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
社区首页 > 专栏 > MongoDB系列8:MongoDB集合的增量更新

MongoDB系列8:MongoDB集合的增量更新

作者头像
大数据和云计算技术
发布 于 2018-07-26 15:46:24
发布 于 2018-07-26 15:46:24
3K 0
举报
文章被收录于专栏: 大数据和云计算技术 大数据和云计算技术

邓开表同学实战MongoDB系列文章,非常不错,赞!大力推荐!

本文是第 8 篇,主要讲述MongoDB集合的增量更新的实战经验,非常值得一看。

前面系列文章:

MongoDB安全实战之Kerberos认证

MongoDB Compass--MongoDB DBA必备的管理工具

MongoDB安全实战之审计

MongoDB安全实战之SSL协议加密

MongoDB安全实战之网络安全加固

MongoDB索引的介绍

MongoDB存储引擎


在关系型数据库中,经常会遇到这样的场景:用某张表或是多张表的关联产生的结果集,然后持续地更新另外一张表的数据,有时为了方便,只更新变化的数据,即增量更新。那么在MongoDB中如何实现这种场景呢?

1、现有student集合,数据如下(s_id--学号,c_id--课程号,name--姓名,sex---性别,score--成绩):

图1

场景一 :将student集合数据复制到另外一个集合target里面,在关系型数据库中,复制一张表的数据可以采用insert into table_a select .....或create table table_aas select .....方式,而在MongoDB中,可以使用如下语句实现:

db.student.find().forEach( function(m) {

db.target.insert(m);

});

图2

场景二 :现在student集合和target集合有一样的数据,后续如果student集合的数据有变化,target集合需要根据student集合的数据进行更新,而且每次只需要更新变化的数据,即增量更新。使用以下的语句来是实现集合的增量更新:

1)先向student集合新增一个文档和修改s_id学号为001的文档:

db.student.insert({"_id":15,"s_id":"006","c_id":7,"name":"ken","sex":"male","score":67})

db.student.update({"s_id":"001"},{"$set":{"sex":"female"}},false,true)

图3

2) 更新集合target的数据:

db.student.find().forEach(function(m){

db.target.findAndModify({

query: { _id : m._id },

update: {Sset : {“s_id”:m.s_id, ”c_id”:m.c_id,”name”:m.name,”sex”:m.sex,”score”:m.score}},

upsert: true

});

});

图4

说明:

query:对应是查询文档,用于检索文档的条件;

update: 对应修改器的文档,用于更新所找到的文档;

upsert: 指当没有文档匹配时,是否插入;

场景三 :多集合关联增量更新另一个集合。

集合student:s_id--学号,c_id--课程号,name--姓名,sex--性别,score--成绩

集合course:_id--课程号,c_name--课程名称

student和course集合数据分别如下图:

图5

图6

1) 现需要查询出成绩合格(大于等于60分),的学生号、学生姓名和课程名称。代码如下:

db.student.aggregate([{

$lookup:

{

from :"course",

localField:"c_id",

foreignField: "_id",

as:"course_documents"

}

},

{

$replaceRoot:{newRoot: {$mergeObjects: [{ $arrayElemAt:["$course_documents",0]},"$$ROOT"] }}

},

{$project:{course_documents:0}},

{$match : {"score":{"$gte":60}}}

]).forEach(function(m) {

db.pass.insert({"_id":m._id,"s_id":m.s_id,"name":m.name,"c_name":m.c_name});

});

图7

说明:

$lookup相当于关系型数据库SQL的join。

其中from参数指定要关联集合B;

localField参数指定集合A的等值对比的键。

foreignField参数指定集合B要与集合A做等值对比的键。

as参数指定符合关联的集合B记录,以指定名称作为键,集合B记录为值的数组形式返回。

$replcaceRoot作用是指定文档提升到顶层,由于$lookup关联后,集合B的记录是作为as参数指定名称的键的值,和集合A的字段不在同个层级,可以使用$replaceRoot实现文档提升到顶层。

$project作用是指定的键是否排除,0表示排除,1表示保留。

$match相当于关系型数据库SQL的where子句。

2) 当student和course集合数据增加时,增量更新pass集合。

分别向student、course添加两个文档:

db.student.insert({"_id":16,"s_id":"007","c_id":11,"name":"tony","sex":"male","score":57})

db.student.insert({"_id":17,"s_id":"007","c_id":12,"name":"tony","sex":"male","score":67})

db.course.insert({"_id":11,"c_name":"Spark"})

db.course.insert({"_id":12,"c_name":"Hbase"})

增量更新pass:

db.student.aggregate([{

$lookup:

{

from :"course",

localField:"c_id",

foreignField:"_id",

as:"course_documents"

}

},

{

$replaceRoot:{newRoot: {$mergeObjects: [{ $arrayElemAt:["$course_documents",0]},"$$ROOT"] }}

},

{$project:{course_documents:0}},

{$match : {"score":{"$gte":60}}}

]).forEach(function(m) {

db.pass.findAndModify({

query:{_id:m._id},

update:{$set :{"s_id":m.s_id,"name":m.name,"c_name":m.c_name}},

upsert:true

});

});

图8

小结:

使用惯关系型数据库后,对于转用No-SQL数据库的人,许多场景在关系型数据库中实现方式,在No-SQL数据库不一定可用。本文讲述了增量更新场景在MongoDB中的实现,希望对大家有帮助。

本文参与 腾讯云自媒体同步曝光计划 ,分享自微信公众号。
原始发表:2018-04-03 ,如有侵权请联系 [email protected] 删除
mongodb
安全
kerberos

本文分享自 大数据和云计算技术 微信公众号, 前往查看

如有侵权,请联系 [email protected] 删除。

本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!

mongodb
安全
kerberos
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
产品介绍 产品文档
云数据库采购特惠,高性能、高可靠、高安全,超值优惠等你享!
领券
  • 社区

    • 技术文章
    • 技术问答
    • 技术沙龙
    • 技术视频
    • 学习中心
    • 技术百科
    • 技术专区
  • 活动

    • 自媒体同步曝光计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 圈层

    • 腾讯云最具价值专家
    • 腾讯云架构师技术同盟
    • 腾讯云创作之星
    • 腾讯云TDP
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 大数据
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2025 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
健壮的李子  ·  广东省建设工程监理条例 广东省人民政府门户网站
1 月前
深情的绿茶  ·  中国人民银行对十三届全国人大三次会议第8751号建议的答复
1 月前
微笑的饼干  ·  “童年神片”归来:《天书奇谭》背后有哪些历史传说?
5 月前
体贴的路灯  ·  云学堂_百度百科
11 月前
英俊的小马驹  ·  红楼梦:荣国府有两大主要矛盾,分别与王熙凤和贾宝玉有关
11 月前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南