mongoDB的使用
简介
MongoBD是一款由C++语言开发基于分布式文件存储的非关系型数据库(nosql database),主要适用于存储数据量大、读写操作频繁且价值较低的数据集,例如,用户的评论数据等。
MongoDB也是一款最想关系型数据库的非关系型数据库,其内部结构为:
文档(相当于数据库中的表中一行数据)+ 集合(相当于数据库中的表)+数据库。
MongoDB服务就相当于mysql服务。
一个MongoDB服务中的架构均是一对多的关系,MongoDB的查询功能十分的强大,常见的关系型数据库的查询功能MongoDB均能够实现,且MongoDB支持数据所应,能极大提高大数据的查询性能。
MongoDB主要的功能特点
(空泛,不贴近学习)
- 面向对象存储
- 模式自由
- 支持完全索引,包含内部对象
- 支持动态查询
- 支持数据恢复与故障恢复
- 使用高性能的二进制进行数据的存储,包括大型的对象(视频)
- 自动碎片处理,支持云计算层次扩展
- 支持多种编程语言的实现
- 文件的存储格式是类似于JSON的BSON格式。
MongoDB的数据类型
类型 | 描述 |
---|---|
String | 字符串类型,MongoDB只认为编码格式为UTF-8的字符串是合法的 |
Integer | 整形 |
NULL | 空值类型 |
Booealn | 布尔类型 |
Object | 内嵌文档类型 |
ObjectId | 创建文档ID |
Timestamp | 时间戳,记录文档时间 |
Array | 数组类型 |
Binary Data | 二进制类型 |
Code | 代码类型,eg :js |
Regular expression | 正则表达式类型 |
其中
Object ID
是MongoDB默认使用的文档 _id 类型,ObjectId相当于主键,当用户存储数据时未指定数据__id时,mongodb自动默认生成Object ID类型的数据作为 _id 。
ObjectId特点,是一种12bit的数据,其中:
- 4bit时时间戳,格林尼治时间UTC,比北京晚8小时
- 3bit为机器标识码
- 2bit是但是MongoDB实例的进程PID
- 3bit是随机序列号
时间戳Timestamp
是一组64bit的值。前32bit是一个time-time值(与Unix新纪元(1970/1/1)的时间差的秒数);后32bit是某秒的递增序号。在单一mongondb中时间戳是唯一的。
时间Date
表当前时间距离Unix新纪元时间的毫秒值,有符号,新纪元之前的时间为负数,与java时间相同。
优化
1、文档的 _id 是自动生成的好还是指定的好?
自动生成的好,自动生成的ID在建立索引时性能比自己指定的要高,推荐使用默认值。
2、每个文档中均有字段,字段名应为短字段名最好,可提高查询效率。
安装
window系统MongoDB安装
傻瓜式安装即可。
打开MongonDB的启动程序,找到bin目录下存在:
mongo.exe : 客户端
mongod.exe : 服务启动
指定mongondb数据存放地址启动
1、在bin目录下打开命令窗口
mongod --dbpath=地址
2、默认端口号 : 27017
3、使用mongo,连接服务,命令行窗口
mongo
4、查看数据库
show dbs
5、不使用默认端口号启动mongoDB服务
mongod --dbpath=地址 -port=8787
6、mongo连接,指定ip与端口
mongo 127.0.0.1:8787
linux环境下docker安装mongodb
docker run -itd --name=docker_mongodb -p 27017:27017 mongo
常用命令
选择或创建数据库,不存在则创建
use commentdb
查看数据库
show dbs
查看集合,需要先选择数据库
show collections
修改集合的名称
db.comments.renamecollection("comment")
使用集合对文档进行操作
插入数据
db.集合名称.insert(数据)
eg: comment集合若没有则创建,插入后一定存在 _id 字段,不指定则默认ObjectId, _id必须唯一
db.comment.insert({name:"Jankin",age:13})
查询所有
db.comment.find()
带条件查询
db.comment.find({name:"Jankin"})
只查询一条数据
db.comment.findOne()
查询指定条数
db.comment.find().limit(num)
若想按某一字段排序查询
当sort中json的值为1时,表示升序排序
当sort中json的值为-1时,表示降序排序
db.comment.find().sort({字段名:1/-1})
若想排除存在某些字段的值
eg:查询点赞数存在,且不为空的评论
db.comment.find({thumbup:{$ne : null}}).sort({thumbup:-1})
修改文档前json为条件,后为修改的值,将文档内的数据覆盖,只有_id 与{“name”:“Jankin-demo”}
db.comment.update({"_id":值},{“name”:"Jankin-demo"})
指定修改字段 ,使用mongodb中的修改器 s e t , 或 者 称 set,或者称 set,或者称set为文档字段增加器,若增加的字段存在,则设置原字段的值,若不存在,则添加;之所以为文档字段增加器,是因为与之相反的$unset可以删除指定文档的域
db.comment.update({"_id":值},{$set:{“name”:"Jankin-demo"}})
db.comment.uppdate({"_id":值},{$unset:{“name”:"Jankin-demo"}})
删除文档
db.集合名称.remove(条件)
删除全部,慎用
db.集合名称.remove({})
统计条数
db.集合名称.count(条件)
模糊查询——正则表达式
查询包含Jankin的数据
db.comment.find({name:"/Jankin/"})
or 上下等价
db.comment.find({name:{$regex:"Jankin"}})
查询以Jankin开头的数据^
db.comment.find({name:"/^Jankin/"})
查询以Jankin结尾的数据$
db.comment.find({name:"/Jankin$/"})
大于$gt
大于等于$gte
小于 $lt
小于等于$lte
不等于$ne
db.comment.find({name:{$ne : 9090}})
包含与不包含 $in $nin
db.comment.find({name:{$in : [9090,9909]}})
条件连接 and 与 or
eg,查询数据大于等于1000并且小于等于3000的数据
db.comment.find({$and:[{num:{$lte:3000}},{num:{$gte:1000}}])
列值增长,对某列的值进行增长或减少$inc
eg:给 _id的文档字段num 值加1
db.comment.update({条件},{$inc:{num:1}})
对于给某一数值类型的字段增加或减少某一些数值时,尽量使用inc来实现,因为在程序中自己获得然后修改,最后保存在mongoDB中可能导致数据的不一致。而在mongoDB中使用列值增长来进行修改就不会发生这种情况。
可视化工具robomongo
下载免费的Robo 3T,官网下载,傻瓜式安装