-
业务应用场景
“三高” 需求
高并发读写
高效率存储和访问
对数据库的高扩展性和高应用性的需求具体应用场景
社交(用户信息、朋友圈信息、附近人和地点)
游戏 (游戏用户信息、用户装备和积分)
物流(存储订单信息、订单状态)
视频直播(用户信息、点赞互动)特点:数据量大、写入操作频繁、价值较低(对事务性要求不高)
-
简介
MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
MongoDB支持的数据结构非常松散,是一种类似于 JSON 的格式叫 BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于 JSON 对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
-
与mysql的对比
-
数据类型
提示:shell默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)} -
启动 MongoDB
-
方式一:
新建 data 文件
data文件夹下新建db文件夹 作为存放数据库文件的位置
打开 bin 目录 敲定 cmd 打开命令行窗口
敲定命令 mongod --dbpath=…\data\db
-
方式二:
新建 conf 文件夹
再建 mongod.conf 文件
内容
ctrl + c 结束命令行
输入命令 :
mongod -f …/conf/mongod.conf
或
mongod --conf …/config/mongod.conf -
-
shell 连接
打开 bin 目录 敲定 cmd 新建一个命令行窗口 输入:
mongo
或
mongo --host=127.0.0.1 --port=27017
查看已经有的数据库:
show databases(dbs)退出mongodb:
exit更多参数可以通过帮助查看:
mongo --help提示:
MongoDB javascript shell是一个基于javascript的解释器,故是支持js程序的 -
compass 图形化界面
mongodb-compass 解压缩
点击使用即可 -
需求
创建一个数据库名 article
-
基本命令 —— 数据库创建删除
选择和创建数据库的语法格式:
use 数据库名称如果数据库不存在则自动创建,例如,以下语句创建
use article查看有权限查看的所有的数据库命令
show dbs 或 show databases注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
查看当前正在使用的数据库命令
dbMongoDB 中默认的数据库为 test,如果你没有选择数据库,集合将存放在 test 数据库中。
当article不为空有集合时,会自动实例化到磁盘删除数据库
db.dropDatabase()
-
mongodb 三个特殊数据库
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
-
集合
基本语法格式:(显示创建)
db.createCollection(name)查看当前库中的表:show collections命令
集合删除语法格式如下:
db.collection.drop()
或
db.集合.drop()
-
CRUD
-
单个文档插入
使用insert() 或 save() 方法向集合中插入文档,语法如下:db.collection.insert( <document or array of documents>, { writeConcern: <document>, ordered: <boolean> } )
查询 插入成功
查询当前库中的表 说明隐式创建成功
提示:
1)comment集合如果不存在,则会隐式创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
3)插入当前日期使用 new Date()
4)插入的数据没有指定 _id ,会自动生成主键值
5)如果某字段没值,可以赋值为null,或不写该字段。 -
批量插入
db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } )
提示:
插入时指定了 _id ,则主键就是该值。
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。如(了解):try { db.comment.insertMany([ ~ ]); } catch (e) { print (e); }
-
查询
db.collection.find(, [projection])
-
投影查询
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
如:查询结果只显示 _id、userid、nickname :
默认 _id 会显示。
如:查询结果只显示 userid、nickname ,不显示 _id :
再例如:查询所有数据,但只显示 _id、userid、nickname : -
修改
db.collection.update(query, update, options)- 赋值修改
db.comment.update({_id:“1”},{likenum:NumberInt(1001)})
- 局部修改
db.comment.update({_id:“2”},{$set:{likenum:NumberInt(889)}}) - 批量修改
//默认只修改第一条数据
db.comment.update({userid:“1003”},{KaTeX parse error: Expected 'EOF', got '}' at position 21: …nickname:"凯撒2"}}̲) //修改所有符合条件的…set:{nickname:“凯撒大帝”}},{multi:true})
- 列值增长的修改
db.comment.update({_id:“3”},{$inc:{likenum:NumberInt(1)}})
- 赋值修改
-
删除
删除文档的语法结构:
db.集合名称.remove(条件)以下语句可以将数据全部删除,请慎用
db.comment.remove({})
如果删除_id=1的记录,输入以下语句
db.comment.remove({_id:“1”})
-
-
文档分页查询
-
统计查询
db.collection.count(query, options)
-
分页列表查询
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20,例如:
db.comment.find().limit(3)skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
db.comment.find().skip(3)
分页查询:需求:每页2个,第二页开始:跳过前两条数据,接着值显示3和4条数据
//第一页
db.comment.find().skip(0).limit(2)
//第二页
db.comment.find().skip(2).limit(2)
//第三页
db.comment.find().skip(4).limit(2) -
排序查询
db.集合名称.find().sort(排序方式)
-
-
正则的复杂条件查询
MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:
db.collection.find({field:/正则表达式/})提示:正则表达式是js的语法,直接量的写法。
db.comment.find({content:/天气/})例如,我要查询评论内容包含“因为”的所有文档,代码如下:
db.comment.find({content:/^因为/})
-
比较查询
<, <=, >, >= 这个操作符也是很常用的,格式如下: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
示例:查询评论点赞数量大于700的记录 db.comment.find({likenum:{$gt:NumberInt(700)}})
-
包含查询
包含使用$in
操作符。 示例:查询评论的集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$in:[“1003”,“1004”]}})不包含使用
$nin
操作符。 示例:查询评论集合中userid字段不包含1003和1004的文档
db.comment.find({userid:{$nin:[“1003”,“1004”]}})
-
条件连接查询
我们如果需要查询同时满足两个以上条件,需要使用$and
操作符将条件进行关联。(相 当于SQL的and) 格式为:
$and:[ { },{ },{ } ]示例:查询评论集合中likenum大于等于700 并且小于2000的文档:
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
如果两个以上条件之间是或者的关系,我们使用 操作符进行关联,与前面 and的使用方式相同 格式为:
$or:[ { },{ },{ } ]示例:查询评论集合中userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})
-
常用命令小结
选择切换数据库: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}]})
-
查看索引
db.collection.getIndexes()
结果中显示的是默认 _id 索引。默认_id索引:
MongoDB在创建集合的过程中,在 _id 字段上创建一个唯一的索引,默认名字为 id ,该索引可防止客户端插入两个具有相同值的文档,您不能在_id字段上删除此索引。注意:该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键。
-
索引的创建
db.collection.createIndex(keys, options)单字段索引示例:对 userid 字段建立索引:
db.comment.createIndex({userid:1})复合索引:对 userid 和 nickname 同时建立复合(Compound)索引:
-
索引的移除
db.collection.dropIndex(index)
提示: _id 的字段的索引是无法删除的,只能删除非 _id 字段的索引。 -
索引的使用
使用执行计划(解释计划、Explain Plan)来查看查询的情况
db.collection.find(query,options).explain(options
compass下查看
覆盖查询
当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以非常有效。
MongoDB 教程
最新推荐文章于 2024-05-15 10:34:04 发布