简介
MongoDB是一个开源,高性能,无模式的文档型数据库。一个基于分布式文件存储的数据库。利于简化开发和方便扩展。
支持的数据结构非常松散,以一种类似于JSON的格式(BSON),用于存储复杂的数据类型
MongoDB记录是一个文档,由字段和值对应组成的数据结构。字段的类型是字符型,值可以为基本数据类型也可以为文档,数组,文档数组等。
主要应用于:
1,高并发读写
2,对海量数据的存储和访问
3,对数据库的高扩展和高可用
具体表现场景如:
1,社交场景,用于存储用户信息,朋友圈以及地理位置索引
2,游戏场景,游戏用户信息,用户装备,积分,升级等信息的存储和访问
3,物流 场景,订单状态的不断更新
5,直播场景,点赞互动等
特点如下:
1,,数据量大
2,写入频繁
3,数据价值不高,对事务性要求很低
体系结构和mysql对比
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来替代多表连接 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
BSON数据类型参考列表
数据类型 | 描述 | 例子 |
---|---|---|
字符串 | UTF-8字符串都可表示为字符串类型的数据 | {"str":"str"} |
对象id | 对象id是文档的12字节的唯一ID | {"str":ObjectId()} |
布尔值 | true or false | {"str": true} |
数组 | array | {"str": ["a","b","c"]} |
32位整数 | int | 不支持,默认64位浮点数 |
64位整数 | long | 不支持,默认64位浮点数 |
64位浮点型 | double | {"str": 3.1415967} |
null | 表示为空值 | {"str": null} |
undefined | 表示为未定义类型 | {"str": undefined} |
符号 | 不支持 | |
正则表达式 | 正则 | {"str": /b/} |
代码 | 可包含JavaScript代码 | {"str": function(){/**.......*/}} |
二进制数据 | 二进制 | |
最大值/最小值 | BSON中的特殊类型 |
Mongodb下载安装
MangoDB下载地址:Download MongoDB Community Server | MongoDB
MangoDB标准官方文档:What is MongoDB? — MongoDB Manual
手动建立数据存放文档
方式一:命令行参数方式启动服务
在bin目录中打开,输入以下命令:
mongod --dbpath=..\data\db
在启动信息中可以看到,mongodb的默认端口是27017,我们可以通过--port来指定启动端口。
方式二: 配置文件方式启动服务
在解压目录中新建config文件夹,在该文件夹中新建配置文件mongodb.cof。内容参考如下:
storage: dbPath: data路径
启动方式
mongodb -f ../config/mongod。conf 或 mongod --config ../config/mongod.conf
连接mongo命令
mongo 或 mongo --host=127.0.0.1 --port=27017
查看已存在的数据库
show database
退出
exit
查看帮助
mongo --help
Mangodb的默认数据库
数据库 | 介绍 |
---|---|
admin | 从权限看这属于root权限的数据库。将用户添加如这个数据库中,这个用户就会自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行 |
local | 这个数据永远不会被复制(针对集群而言),可以用来存储限于本地单台服务器的任意集合 |
config | 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片相关信息 |
mangodb数据库命令(基本)
1,查看数据库
show dbs 或 show database
2,查看当前数据库
db
3,数据库的删除
db.dropDatabase() 用于删除已持久化的数据库
4,集合的显示创建
db.createCollection(name) name: 为要创建的集合的名称
5,查看当前数据库中的表
show collections or show tables
6,删除集合
db.collection.drop or db.集合名.drop 如果删除成功,则drop()方法返回true,否则返回false
MangoDB文档的操作命令
所有存储在集合中的数据都是BSON格式
1,单个文档的插入
使用insert()或save()方法向集合中插入文档,语法如下
db.collection.insert( <document or array of documents> { writeConcern: <document>, ordered: <boolean> } ) 参数: document: 要插入到集合中的文档或者文档数组 writeConcern: 插入的时候选择的性能级别 ordered: 是否排序。布尔型,可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回不处理数组中的其余文档。如果为假,则执行无序插入,如果其中一个文档出现错误,则继续处理数组中的主文档。在版本2.6+中默认为true 例子: db.comment.insert({"articleid":"10000", "content":"今天天气真好啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
2,批量插入
db.collection.insertMany( [<document 1>, <document 2>……] { writeConcern: <document>, ordered: <boolean> } ) 例子: db.collection.insertMany([ {"id": "1", "articleid":"10000", "content":"今天天气真好啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null}, {"id": "2", "articleid":"10000", "content":"今天天气真不错啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null}])
2,文档的查询
db.collection.find(<query>, [projection]) 参数: query: 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或者传递空文档({}) projection:可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段。请省略此参数
查询所有
db.coment.find() 这里的coment指的是具体的集合名称 或 db.comment.find([])
投影查询
指的是mysql中的select name, id等只查询具体的部分的信息。
db.coment.find({userid: "1003"}, {userid:1,nickname:1}) 这里coment指的是集合名,find中的第一段相当于mysql中where后面的匹配语句。find中的第二段则相当于我们select name, id中的具体值,其中1表示显示,0表示不显示。 再例如: 查询所有数据,但只显示userid,nickname dbcomment.find({}, {userid:1, nickname:1})
3,文档的更新
db.collection.update(query, update, options) 或 db.collection.update( <query>, <update>, { upsert:<boolean>, multi:<boolean>, writeConcern:<document>, collation:<document>, arrayFilters: [<filterdocument1>, ……], hint:<document|string> } ) 参数: query: 更新的选择条件。可以使用find()方法中相同的查询选择器。类似sql更新中where后面的 update:要修改的部分。 upsert:为true则在没有与查询调教匹配的文档时创建新文档。默认为false multi:为true则表示更新符合查询条件的多个文档。为false则只更新一个文档。默认为false writeConcern:表示写问题的文档。抛出异常级别
覆盖的修改
db.comment.update({_id:"1"}, {likenum:NumberInt(1001)}) 这里comment指的是集合 update中第一段表示query查询的条件 update中第二段表示update要更改为的部分。也就是会替换原BSON的内容
局部修改
为了实现这个操作需要借助$set来实现 如: db.comment.update({_id:"1"}, {$set:{likenum:NumberInt(889)}})
批量的修改
更新符合条件的所有文档
// 默认只修改第一条数据 db.comment.update({userid:"1"}, {$set:{likenum:NumberInt(889)}}) // 修改所有符合条件的数据 db.comment.update({userid:"1"}, {$set:{likenum:NumberInt(889)}}, {multi:true})
增长或删除式的修改
如果我们需要对某列的值在原有的基础上进行增加或者减少,可以使用$inc运行符进行实现
db.comment.update({_id:"3"}, {$inc:{likenum:NumberInt(1)}})
4,删除文档
语法 db.集合名称.remove(条件) 全部删除 db.comment.remove({}) 根据调教删除 db.comment.remove(_id:"1")
5,文档的统计,分页以及排序查询
统计查询,统计使用count()方法
db.collection.count(query, options) 参数: query: 查询的选择条件 options: 可选,用于修改计数的额外选项。 例如: 计算所有文档 db.comment.count() 根基条件计算统计数 db.comment.count({userid: "1003"})
分页查询,我们可以使用limit()方法来指定分页查询,使用skip()方法来跳过指定的数据
基本语法 db.集合名称.find(条件).limit(pageSize).skip(offset) 例如: 查询第一页 db,comment.find().skip(0).limit(2) 查询第二页 db.comment.find().skip(2).limit(2)
排序查询
我们使用sort()方法进行对数据的排序,sort()方法可以通过指定排序的字段,并使用1和-1来指定排序的方式。其中1为升序排列,而-1是用于降序排列。
基本语法 db.集合名称.find().sort({KEY:1}) 或 db.集合名称.find().sort(排序方式)
6,更多的模糊查询
正则查询
基本语法 db.集合名称.find()({字段:/正则表达式/}) 例如: 查询所有包含开水的文档 db.comment.find({content:/开水/})
比较查询
通用<,<=,>,>=
基本语法 db.集合名称.find({field : {$gt: value}}) // 大于 db.集合名称.find({field : {$lt: value}}) // 小于 db.集合名称.find({field : {$gte: value}}) // 大于等于 db.集合名称.find({field : {$lte: value}}) // 小于等于 db.集合名称.find({field : {$ne: value}}) // 不等于 例如: db.comment.find({_id:{$gt:NumberInt(2)}})
包含查询
包含使用$in操作符
基本语法 db.集合名称.find({field: {$in:["值1", "值2"]}}) 例如: db.comment.find({user:{$in:["1003","1004"]}})
条件查询
如果我们需要查询同时满足两个以上的条件,需要使用$and操作符进行关联。相当于sql中的and.
如果是或的关系,我们需使用$or进行关联
基本语法 db.集合名称.find({$and:[{条件1}, {条件2}]}) 例如: db.comment.find({$adnd:[{ikenum:{$gte:NumberInt(500)}, {ikenum:{$lt:NumberInt(700)}}}]) $or同$and一致