Mongo的具体使用场景、例子和使用mongo的优缺点

mongo存储例子

适合使用mongo的数据

实时数据:mongo非常适合实时的插入,更新和查询,具备实时数据存储所需的复制及高度伸缩性

关系简单的数据:MongoDB是个nosql数据,所以关系能力薄弱,不能像MySQL一样使用join,union来进行联合查找,只能通过结合一些特殊语法来达到类似的结果;事务能力薄弱,MongoDB里事务只能针对单条语句,不能像MySQL一样利用事务执行多条语句根据情况来选着全部提交执行或者全部取消回滚。

数据量大的数据:自动分片形成的集群,可动态添加机器

具体例子:

  • 可以用来存储网站数据,mongo适合写入大批量、高并发、不规则的数据,网站的数据没有固定的格式,可能会出现信息不完整的问题,很适合用非关系的数据库存储,比如用爬虫爬下来的信息存储到mongo中

  • 有些人会将MySQL中的部分表迁移到MongoDB中,主要是涉及到车辆历史轨迹以及温湿度数据等机器采集到的数据,而订单数据、客户数据等信息,仍然放到MySQL数据库中,主要是因为这两类数据实时采集实时更新,会随着时间的推移,项目的扩大,造成非常巨大的数据量,而一般MySQL在单表数据量超过500万后,性能就会下降的比较快,而mongodb的分片集群就不会出现这个问题

  • 还可以用来存储我们的平台上虚拟机的监控信息,包括内存、IO、CPU、网络等数据,通常每隔几秒就采集一次数据,每周、每月,量很大,而且旧的监控数据也不会保留太长时间,就适合使用的mongodb来存储这些数据

  • 使用快速开发新应用,需求会变,数据模型还无法确定,适合使用mongodb

  • 使用MongoDB做O2O快递应用,·将送快递骑手、快递商家的信息(包含位置信息)存储在 MongoDB,然后通过 MongoDB 的地理位置查询(mongodb自带地理位置索引),这样很方便的实现了查找附近的商家、骑手等功能,使得快递骑手能就近接单

  • 一些公司MongoDB的实际应用

    • Craiglist上使用MongoDB的存档数十亿条记录。

    • FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。

    • Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。

    • bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。

    • spike,一个MTV网络的联营公司,使用MongoDB。

    • Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。

    • sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。

    • etsy ,一个购买和出售手工制作物品网站,使用MongoDB。

    • 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。

    • CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。

  • 从阿里云MongoDB云数据库的用户看,MongoDB已经应用各个领域

    • 游戏场景:使用mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,更新

    • 物流场景:使用Mongodb存储订单信息,订单状态在运送过程中会不断更新,以Mongodb内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

    • 社交场景:使用mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能

    • 物联网场景:使用mongodb存储所有接入的智能设备信息,以及设备回报的日志信息,并对这些信息进行多维度的分析

    • 视频直播:使用Mongodb存储用户信息,礼物信息等


为什么要用mongo存储数据/好处?

  1. 适合存储对象(即Object)和JSON形式的数据,字段格式自由

  2. 查询表达式丰富,可以轻易查询文档中内嵌的对象和数组

    //查询数组
    db.blog.find({"comments":{"name":"ickes","score":{"$gt":5}})
    //利用了正则表达式,查询内嵌文档某个字段包含某个字符串
    db.getCollection("goal_report").find({"goals":{"$elemMatch":{"goal":{"$regex":/价值目标/}}}})

    mongodb采用了特有的查询方式,和mysql差距大

    mongodbmysql注释
    db.collection.find()select * from collection查找整个表
    db.collection.find({},{"userid":1}) //1 为显示 //0 为不显示select userid from collection查找指定键名对应的全部值
    db.collection.find({"userid":495})select * from collectionwhere userid = 495条件过滤
    db.collection.count()select count(*) from collection数目
    $gt>
    $gte>=
    $lt<
    $lte<=
    $ne!=
    操作符号 nullis null
    $all 主要用于数组的匹配=匹配所有
    $size 用于查询指定长度数组独有
    $inin
    $ninnot in
    $andand
    $not 取反集,配合其他表达式使用独有
    $oror
    $exists 查询字段是否存在独有
    $regex 正则表达式独有
    $slice 数组中元素个数独有

  3. 不存在sql注入的问题,安全性高 客户端提交数据时,可以把一些sql语句加入其中,让数据库执行这些语句来获得违规权限或内部信息,这就是sql注入 而mongodb在执行查询语句时,会把输入的值组装成一个BSON对象(注入语句作为BSON对象的value),而不是字符串,因此注入的语句不会得到执行

  4. 可以任意添加字段,灵活性高,更新方便

  5. 自动分片可以将数据分散到不同机器上形成集群,读写效率高

  6. 将热点数据加载到内存,查询会非常快 mongo把经常读取的数据会被加载到内存中,这样提高查询效率

    mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,把磁盘IO操作转换成内存操作。

    1. 内存映射文件是OS通过mmap在内存中创建一个数据文件,这样就把文件映射到一个虚拟内存的区域。

    2. 操作系统通过mmap来把进程所需的所有数据映射到这个地址空间(红线),然后再把当前需要处理的数据映射到物理内存(灰线)

    3. 当进程访问某个数据时,如果数据不在虚拟内存里,触发page fault,然后OS从硬盘里把数据加载进虚拟内存和物理内存

    4. 如果物理内存满了,触发swap-out操作,这时有些数据就需要写回磁盘,如果是纯粹的内存数据,写回swap分区,如果不是就写回磁盘


缺点

由于空间的预分配,key-value形式的字段名,以及删除空间不会释放字段(需要通过命令来整理碎片,这个过错比较缓慢)导致mongodb占用空间会比较大

MongoDB没有如MySQL那样成熟的维护工具,维护会比较困难

由于数据加载到了内存中,会非常消耗内存

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值