由于最近公司的一个项目需要使用大MongoDB数据库作为日志存储,虽然之前对MongoDB有过了解,但是却没有一些系统的了解,其中部分资源出资其他博客,若有涉及到您的利益,请多多谅解。
一.什么是MongoDB
MongoDB是一个用c++开发的,高性能、开源、无模式的文档型数据库,是当前NoSQL数据库中的一种。
二.MongoDB的使用场景
1. 用在应用服务器的日志记录,查找起来比文本灵活,到处也很方便。
2. 用在一些第三方信息的获取或者抓取,因为MongoDB的schema-less,所有格式灵活,不用为了各种格式不一样的信息专门设计统一的格式,极大的减少开发工作。
3. 用来存储一些监控数据。
4. 使用MongoDB做了O2O快递应用,将送快递骑手、快递商家的信息(包含位置信息)存储在MongoDB,然后通过MongoDB的地理位置查询,这样很方便的实现了查询附近的商家、骑手等功能。
5. MongoDB的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理等。
n 游戏:使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询更新。
n 物流:使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就可以将订单所有的变更读取出来。
n 社交:使用MongoDB存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
n 物联网:使用MongoDB存储所有接入的只能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
n 视频直播:使用MongoDB存储用户信息、礼物信息等。
。。。。。。
三.MongoDB的主要特性
MongoDB特性 | 优势 |
事务支持 | MongoDB目前只支持单文档事务,需要复杂事务支持的场景暂时不适合。 |
灵活的文档模型 | Json格式存储最接近真实对象模型,对开发者友好,方便快开发迭代。 |
高可用复制集 | 满足数据高可靠、服务高可用的需求,运维简单,故障自动切换 |
可扩展分片集群 | 海量数据存储,服务能力水品扩展。 |
高性能 | mmapv1、wiredtiger、mongorocks(rocksdb)、im-memeory等多引擎支持满足各种场景需求。 |
强大的索引支持 | 地理位置索引可用于构建各种o2o应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求。 |
Gridfs | 解决文件存储的需求。 |
Aggregration& mapreduce | 解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到MongoDB上完成。 |
四.MongoDB与关系型数据库的对比
对比项 | MongoDB | 关系型数据库(mysql、oracle) |
数据库 | 数据库(database) | 数据库(database、schema) |
表 | 集合(Collection) | 二维表(table) |
表中的一行数据 | 文档(document) | 一条记录(record) |
表字段 | 键(key) | 列(column) |
主外键 | 无 | 主键pk、外键fk |
灵活度扩展性 | 极高 | 差 |
五.MongoDB命令行客户端的脚本语法;
1. 下载MongoDB,地址:官方网站:http://www.mongodb.org/downloads;在windows系统下载MongoDB后,解压即可。在启动MongoDB之前,我们必须新建一个存放MongoDB数据和日志的目录。
2. 运行MongoDB服务端,打开cmd窗口,进入MongoDB解压目录下的bin目录下,运行mongod.exe。
C:\>cd C:\MongoDB\bin C:\MongoDB\bin>mongod.exe --dbpath=C:\MongoDB\data\db --directoryperdb --logpath =C:\MongoDB\data\logs --logappend |
一般来说,只需指定—dbpath即可。
3. 运行客户端,另外打开一个cmd窗口,进入到bin目录下,运行客户端的mongo.exe来登录MongoDB,启动shell,shell会在启动时自动连接MongoDB服务器,默认连接test数据库。
4. 脚本语法:
show dbs //列出所有数据库
use memo //使用数据库memo,即使这个库不存在也可执行,但该数据库不会立即被创建,只有执行insert操作时,才会创建。
show collections //列出当前所有数据库的collections
db //显示当前数据库
show users 列出用户
db.createCollection(‘XXX’) //创建集合
db.XXX.save()/ db.XXX.insert() //往集合中插入数据,数据为json格式的键值对数据。
查询数据:
$lt ->less than 小于
$lte ->less than and equal 小于等于
$gt ->greaterthan 大于
$gte ->greaterthan and equal 大于等于
$ne ->not equal 不等于
MongoDB的查询语法与SQL查询的比较
db.foo.find() // select * from foo db.foo.find().limit(10) // select * from foo limit 10 db.foo.find().sort({x:1}) // select * from foo order by x asc 1:升序 -1:降序 db.foo.find().sort({x:1}).skip(5).limit(10) // select * from foo order by x asc limit 5, 10 db.foo.find({x:10}) // select * from foo where x = 10 db.foo.find({x: {$lt:10}}) // select * from foo where x <= 10 db.foo.find({}, {y:true}) // select y from foo 一些SQL不能做的,MongoDB也可以做: db.foo.find({"address.city":"gz"}) // 搜索嵌套文档address中city值为gz的记录 db.foo.find({likes:"math"}) // 搜索数组 db.foo.ensureIndex({"address.city":1}) // 在嵌套文档的字段上建索引 |
更新数据:
db.XXX.update({},{}) 第一个参数是查询对象,第二个参数是替代的,可以在第二个对象里指定更新那些字段,要使用$set。$set用来指定一个键的值,如果不存在则创建,如果存在则更新。
删除条件查询:
db.XXX.remove()
删除数据集合:
db.XXX.drop();
删除当前数据库:
db.dropDatabase();