目录
- 一、MongoDB概念
- 1、使用业务应用场景
- 2、 使用场景选择
- 3、简介
- 4、体系结构
- 二、基本命令使用
- 1、数据库操作
- 2、集合操作
- 3、文档操作
- 3.1.1.新增文档
- 3.1.2.查询文档
- 3.1.3.更新文档
- 3.1.4.删除文档
- 3.1.5.高级查询
- 4、命令总结★
一、MongoDB概念
1、使用业务应用场景
具体的应用场景参考如下:
1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
订单所有的变更读取出来。
4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。
2、 使用场景选择
应用不需要事务以及复杂的 join 支持。
应用数据模型无法确定,想快速迭代开发。
应用读写的QPS高。
应用需要大数据级别数据存储。
应用需要大量的地理位置查询、文本查询(比如:日志储存)。
3、简介
MongoDB是一个开源、高性能、无模式的文档型数据库,是最像关系型数据库(MySQL)的非关系型数据库。
它支持的数据结构非常松散,是一种类似于 JSON 的格式叫BSON
,所以它既可以存储比较复杂的数据类型,又相当的灵活。
MongoDB中的记录是一个文档,它是一个由字段和值对(fifield:value)组成的数据结构象,即一个文档认为就是一个对象。
字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
具有:高性能、高可用、高拓展、无模式结构 特点
4、体系结构
默认情况下,mongodb有三个默认库:admin、local、config
- admin: 这是"root"数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
二、基本命令使用
1、数据库操作
# 创建/使用数据库(如果数据库不存在,则创建数据库dbame,否则切换到指定的数据库dbname)
use 数据库名称(比如:use testdb)
# 查询所有库(新增的库,没有创建集合则不会被查询到)
show dbs
# 查看当前操作的库
db
# 删除库
use 具体数据库名
db.dropDatabase()
2、集合操作
创建集合-显示创建:
# 进入testdb数据库
use testdb
# 创建集合
db.createCollection('name');
查询所有集合:
show collections
删除集合:
为了演示删除效果,多创建几个集合,如下:
使用删除方法,删除名称为test1
的集合,命令如下:
# db.集合名称.drop(),比如:
db.test1.drop()
效果:
3、文档操作
一下操作时,数据库名称为tsetdb
,集合的名称为test
。
3.1.1.新增文档
新增文档,多个由逗号分隔 【如果当前的集合名称不存在,则会被自动创建】
测试内容:
// articleid、content、userid为文档中的字段名称
db.test.insert([{
"articleid":"1",
"content":"测试内容1",
"userid":"1"
},{
"articleid":"2",
"content":"测试内容2",
"userid":"2"
}]);
效果:
3.1.2.查询文档
查询所有:
db.test.find()
查询所有-指定字段:
查询所有数据,并且返回指定字段,默认会返回_id字段,0表示不返回
db.test.find({},{userid:1,content:1,_id:0})
指定查询-返回一条文档的所有字段:
db.test.findOne({userid:'1'})
指定查询-返回所有文档的所有字段:
db.test.find({userid:'1'})
指定查询-返回特定字段:
查询userid为1的所有数据,并且返回指定字段,默认会返回_id字段,0表示不返回
db.test.find({userid:'1'},{userid:1,content:1,_id:0})
3.1.3.更新文档
1、覆盖更新:
文档只会保留更新的字段,其他字段被删除
db.test.update({userid:"1"},{content:"修改内容"});
效果:
2、局部更新:
通过$set
指令 ,使得只有被修改的字段才进行更新
db.test.update({userid:"2"},{$set:{content:"局部更新内容"}})
3、批量更新:
不管是上面说到的覆盖更新
还是局部更新
,都只会去匹配一条数据,也就是说当更新了一条满足要求的数据后,即使还有满足要求的数据也不会进行更新,除非再次执行更新
命令,显然这种是不合理的,所以需要使用到批量更新
;
db.test.update({userid:"1"},{$set:{content:"批量更新"}},{multi:true})
4、创建更新:
如果更新的文档值不存在,则插入文档进行新增
db.test.update({userid:"3"},{$set:{content:"创建更新"}},{upsert:true})
效果:
3.1.4.删除文档
删除全部文档:
db.test.remove({})
按条件删除文档:
# 比如:删除userid为1的文档数据
db.test.remove({userid:"1"})
3.1.5.高级查询
1、统计查询:
# {}表示带上条件
db.test.count() 或者 db.test.count({userid:'1'})
2、分页查询:
可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据
# 第一页,每页两条(下标值为0、1),所以skip为0
db.test.find().skip(0).limit(2)
# 第二页(下标值为2、3),所以skip为2
db.test.find().skip(2).limit(2)
效果:
3、排序查询:
sort() 方法对数据进行排序, 1 为升序排列, -1 是用于降序排列
db.test.find().sort({userid:-1})
4、分页排序查询:
先 sort(), 然后是 skip(),最后是显示的 limit()
db.test.find().skip(0).limit(2).sort({userid:-1})
5、正则查询:
# field表示文档中的某个字段
db.lhz.find({field:/正则表达式/})
6、比较查询:
大于-$gt、小于-$lt、大于等于-$gte、小于等于-$lte、不等于-$ne
# userid大于10
db.test.find({ "userid" : { $gt: 10 }})
7、包含查询:
包含-$in,不包含-$nin
db.test.find({userid:{$in:["1","2"]}})
8、多条件查询:
and
和or
可以结合使用
# 且查询
db.test.find({$and:[{userid:"1"},{articleid:{$gt:1}}]})
# 或查询
db.test.find({$or:[{userid:"2"},{articleid:{$lt:1}}]})
4、命令总结★
选择切换数据库:use articledb
插入数据: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}]})