1 、MongoDB相关概念
1.1、 业务应用场景
传统的关系型数据库(如MySQL),在数据操作的“三高”需求以及应对Web2.0的网站需求面前,显得力不从心。
解释:“三高”需求:
• High performance - 对数据库高并发读写的需求。 • Huge Storage - 对海量数据的高效率存储和访问的需求。
• High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
而MongoDB可应对“三高”需求。
具体的应用场景如:
1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
订单所有的变更读取出来。 4)物联网场景,使用 MongoDB
存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。 5)视频直播,使用 MongoDB
存储用户信息、点赞互动信息等。 这些应用场景中,数据操作方面的共同特点是: (1)数据量大 (2)写入操作频繁(读写都很频繁)
(3)价值较低的数据,对事务性要求不高
对于这样的数据,我们更适合使用MongoDB来实现数据的存储。
什么时候选择MongoDB
在架构选型上,除了上述的三个特点外,如果你还犹豫是否要选择它?可以考虑以下的一些问题:
应用不需要事务及复杂 join 支持
新应用,需求会变,数据模型无法确定,想快速迭代开发
应用需要2000-3000以上的读写QPS(更高也可以)
应用需要TB甚至 PB 级别数据存储
应用发展迅速,需要能快速水平扩展
应用要求存储的数据不丢失
应用需要99.999%高可用
应用需要大量的地理位置查询、文本查询
如果上述有1个符合,可以考虑 MongoDB,2个及以上的符合,选择MongoDB 绝不会后悔。
思考:如果用MySQL呢?
答:相对MySQL,可以以更低的成本解决问题(包括学习、开发、运维等成本)
1.2 MongoDB简介
MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认
为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
1.3 体系结构
1.4、特色对比
像MySQL一样,MongoDB提供了丰富的远远超出了简单的键值存储中提供的功能和功能。
MongoDB具有查询语言,功能强大的辅助索引(包括文本搜索和地理空间),数据分析功能强大的聚合框架等。相比使用关系数据库使用MongoDB,您还可以使用这些功能,跨越更多样化的数据类型和数据规模。
1.5 MongoDB的特点
MongoDB主要有如下特点:
(1)高性能:
MongoDB提供高性能的数据持久性。特别是,对嵌入式数据模型的支持减少了数据库系统上的I/O活动。
索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求、地理位置索引可用于构建各种 O2O 应用)mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求。Gridfs解决文件存储的需求。
(2)高可用性:
MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。
(3)高扩展性:
MongoDB提供了水平可扩展性作为其核心功能的一部分。
分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展)
从3.4开始,MongoDB支持基于片键创建数据区域。在一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些
片。
(4)丰富的查询支持:
MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
(5)其他特点:如无模式(动态模式)、灵活的文档模型、
2、部署
3、常用命令
3.1、案例需求
将快递信息存放在MongoDB数据库中
常用命令
1、启动数据库
mongod -dbpath=..\data\db
mongo
2、查看已有数据库
show dbs
3、切换(创建)数据库
use exp
4、查看当前所在数据库
db
5、删除数据库
db.dropDatabase()
6、创建集合、表
> db.createCollection("explocker")
{ "ok" : 1 }
7、查看当前数据库所有集合(表)
> show collections
explocker
> show tables
explocker
7、删除集合
> db.explocker.drop()
true
8、文档的插入
单个
> db.explocker.insert({"explockerno":"QM001","explockername":"巧目测试柜001","sysuser":"宋海华001"})
WriteResult({ "nInserted" : 1 })
多个
db.explocker.insertMany([
{"explockerno":"QM002","explockername":"巧目测试柜002","sysuser":"宋海华002"},
{"explockerno":"QM003","explockername":"巧目测试柜003","sysuser":"宋海华003"},
{"explockerno":"QM004","explockername":"巧目测试柜004","sysuser":"宋海华004"},
{"explockerno":"QM005","explockername":"巧目测试柜005","sysuser":"宋海华005"}
])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5ec3f6cb8be1b569413f501a"),
ObjectId("5ec3f6cb8be1b569413f501b"),
ObjectId("5ec3f6cb8be1b569413f501c"),
ObjectId("5ec3f6cb8be1b569413f501d")
]
}
9、查询
查所有
db.explocker.find()
{ "_id" : ObjectId("5ec3f4f68be1b569413f5019"), "explockerno" : "QM001", "explockername" : " 巧目测试柜001", "sysuser" : "宋海华001" }
{ "_id" : ObjectId("5ec3f6cb8be1b569413f501a"), "explockerno" : "QM002", "explockername" : " 巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3f6cb8be1b569413f501b"), "explockerno" : "QM003", "explockername" : " 巧目测试柜003", "sysuser" : "宋海华003" }
{ "_id" : ObjectId("5ec3f6cb8be1b569413f501c"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3f6cb8be1b569413f501d"), "explockerno" : "QM005", "explockername" : " 巧目测试柜005", "sysuser" : "宋海华005" }
条件查询
> db.explocker.find({_id:ObjectId("5ec3f4f68be1b569413f5019")})
{ "_id" : ObjectId("5ec3f4f68be1b569413f5019"), "explockerno" : "QM001", "explockername" : " 巧目测试柜001", "sysuser" : "宋海华001" }
投影查询(mysql中不查全部字段),id会默认显示
> db.explocker.find({_id:ObjectId("5ec3f4f68be1b569413f5019")},{explockerno:1,explockername:1})
{ "_id" : ObjectId("5ec3f4f68be1b569413f5019"), "explockerno" : "QM001", "explockername" : " 巧目测试柜001" }
如果不想让id暴露出来
> db.explocker.find({_id:ObjectId("5ec3f4f68be1b569413f5019")},{explockerno:1,explockername:1,_id:-1})
{"explockerno" : "QM001", "explockername" : " 巧目测试柜001" }
10、更新
update后面第一个是更新条件、第二个更新内容
全部更新(单)
> db.explocker.update({explockerno:"QM001"},{explockername:"喵柜测试柜001"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
局部更新(单)
> db.explocker.update({explockerno:"QM002"},{$set:{explockername:"喵柜测试柜002"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更新全部符合条件的
db.explocker.update({explockerno:"QM002"},{$set:{explockername:"喵柜测试柜004"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
10、删除
条件删除
db.explocker.remove({_id:ObjectId("5ec3f4f68be1b569413f5019")})
WriteResult({ "nRemoved" : 1 })
全部删除
db.explocker.remove({})
WriteResult({ "nRemoved" : 8 })
11、统计
统计所有
> db.explocker.count()
8
条件统计
> db.explocker.count({explockerno:"QM005"})
2
12、分页
skip()跳过多少条 limit()取前多少个
> db.explocker.find().skip(2).limit(1)
{ "_id" : ObjectId("5ec3fdba8be1b569413f5024"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
13、排序
-1降序 1正序
> db.explocker.find().sort({explockerno:-1,_id:-1})
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5029"), "explockerno" : "QM005", "explockername" : " 巧目测试柜005", "sysuser" : "宋海华005" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5025"), "explockerno" : "QM005", "explockername" : " 巧目测试柜005", "sysuser" : "宋海华005" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5028"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5024"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5027"), "explockerno" : "QM003", "explockername" : " 巧目测试柜003", "sysuser" : "宋海华003" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5023"), "explockerno" : "QM003", "explockername" : " 巧目测试柜003", "sysuser" : "宋海华003" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5026"), "explockerno" : "QM002", "explockername" : " 巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5022"), "explockerno" : "QM002", "explockername" : " 巧目测试柜002", "sysuser" : "宋海华002" }
14、其他查询
正则
db.explocker.find({sysuser:/002/})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5022"), "explockerno" : "QM002", "explockername" : " 巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5026"), "explockerno" : "QM002", "explockername" : " 巧目测试柜002", "sysuser" : "宋海华002" }
比较
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
```> db.explocker.find({explockerno:{$gt:"QM003"}})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5024"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5025"), "explockerno" : "QM005", "explockername" : " 巧目测试柜005", "sysuser" : "宋海华005" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5028"), "explockerno" : "QM004", "explockername" : " 巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5029"), "explockerno" : "QM005", "explockername" : " 巧目测试柜005", "sysuser" : "宋海华005" }
包含查询 $in
> db.explocker.find({explockerno:{$in:["QM003","QM004"]}})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5023"), "explockerno" : "QM003", "explockername" : "巧目测试柜003", "sysuser" : "宋海华003" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5024"), "explockerno" : "QM004", "explockername" : "巧目测试柜004", "sysuser" : "宋海华004" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5027"), "explockerno" : "QM003", "explockername" : "巧目测试柜003", "sysuser" : "宋海华003" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5028"), "explockerno" : "QM004", "explockername" : "巧目测试柜004", "sysuser" : "宋海华004" }
不包含查询 $nin
> db.explocker.find({explockerno:{$nin:["QM003","QM004"]}})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5022"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5025"), "explockerno" : "QM005", "explockername" : "巧目测试柜005", "sysuser" : "宋海华005" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5026"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5029"), "explockerno" : "QM005", "explockername" : "巧目测试柜005", "sysuser" : "宋海华005" }
与and查询
> db.explocker.find({$and:[{explockerno:"QM002"},{explockername:"巧目测试柜002"}]})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5022"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5026"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
或or查询
> db.explocker.find({$or:[{explockerno:"QM002"},{explockername:"巧目测试柜005"}]})
{ "_id" : ObjectId("5ec3fdba8be1b569413f5022"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdba8be1b569413f5025"), "explockerno" : "QM005", "explockername" : "巧目测试柜005", "sysuser" : "宋海华005" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5026"), "explockerno" : "QM002", "explockername" : "巧目测试柜002", "sysuser" : "宋海华002" }
{ "_id" : ObjectId("5ec3fdbc8be1b569413f5029"), "explockerno" : "QM005", "explockername" : "巧目测试柜005", "sysuser" : "宋海华005" }
15、查询小结
插入数据:db.comment.insert({bson数据})
查询所有数据:db.comment.find();
条件查询数据:db.comment.find({条件})
查询符合条件的第一条记录:db.comment.findOne({条件})
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}}) 删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算:db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})