MongoDB使用

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 体系结构

MySQL和MongoDB对比
在这里插入图片描述

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}]})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值