上手MongoDB#
MongoDB 是一个跨平台的,面向文档的数据库,如果你了解spring-data-jpa的使用, 那么恭喜你,你已经可以使用mongodb做开发了
使用这种类型的数据库还是挺方便的,最小的存储单位是一个文档,但是文档有什么字段,有多少字段它都不关心,而mysql这样的典型的关系型数据库,开发之前得把表设计的明明白白的,说不定还得预留几个字段以备不时之需,因为后续再改就麻烦了
。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
体系结构#
MongoDB | Mysql |
database | database |
collection | 数据表 |
document | 表中的一行记录 |
index | index |
$lookup | table join |
_id | primary key |
aggregation pipeline | group by |
一 个MongoDB实例支持多个database并存,同时一个database中可以包含多个collection,所以大家都说它是介于关系数据库和非关系数据库之间,因为它的组成结构真的特别像关系型数据库
支持的数据类型#
数据类型名 | BSON |
null | {"XXX":null} |
布尔值: | {"XXX":true/false} |
int | {"XXX":NumberInt("1")} |
Long | {"XXX":NumberLong("1")} |
字符串 | {"XXX":"啊哈哈哈"} |
日期 | {"XXX":new Date()} |
正则 | {"XXX":null} |
布尔值: | {"XXX"😕[abc]/} |
数组 | {"XXX":["a","b","c"]} |
文档的嵌套: | {"XXX":{"YYY":3}} |
对象id | {"XXX":objectId()} |
聚合类比#
MySQL | MongoDB |
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum | $sum |
count | $sum |
注意点:
- 当我们再在命令行窗口通过命令行进行数据的读写时,如果我们这样写 {"XXX",2}, 它会默认把2处理成浮点类型,而不是整形
- 每一个文档唯一身份id是 _id , 前面有个下划线
使用命令行进行数据的读写#
- 开启本地的mongo服务器(用来保存数据)打开之后,就别关了
默认使用的端口是 27017
mongod -dbpath=指定文件夹当作数据存储路径 --port 端口号
- 连接数据库(客户端,进行CRUD)
// 在本机直接用下面的命令,模拟连接本机的mongodb mongo // 连接远程的mongo mongo 192.168.88.88
- 退出
exit
- 选择数据库
默认选中的数据库是test库
// 如果数据名不存在,默认直接把它创建出来,并且直接选中它使用 user 数据库名
- 查看当前数据库
db
- 保存一条数据
入参位置的bson, 注意key的部分是没有双引号的 db.集合名.insert({content:"哈哈,保存了数据"})
- 查询全部数据, 默认按照_id从小到大排序
db.集合名.find()
- 返回满足条件的全部数据
入参部分的查询条件 bson同样是json格式 db.集合名.find({id:"123"})
- 返回满足条件的第一条数据
入参部分的查询条件 bson同样是json格式 db.集合名.findOne({id:"123"})
- 根据限制的数量, 返回满足条件的数据
入参部分的查询条件 bson同样是json格式 db.集合名.find({id:"123"}).limit(1)
- 更新文档
db.集合名.update(条件,修改后的数据) // 下面的这条修改语句存在问题,只会保留name字段 db.集合.update({_id:"1"},{name:"新名字"}) // 保留其他字段的写法 db.集合名.update({条件},{$set:{新的值} }) db.集合.update({_id:"1"},{$set:{name:"新名字"}})
- 删除文档
db.集合.remove(条件) // 删除全部 db.集合.remove({})
- 统计数量
db.spit.count() db.spit.count({条件})
- 使用正则实现.模糊查询
/将被模糊查询的字符串/
db.集合名.find({content:/将被模糊查询的字符串/}) //匹配以XXX开头的文档 db.集合名.find({content:/^XXX/})
- 大于,小于,不等于
db.集合名.find({"参考的字段":{$gt:value}}) // 查找参考的字段大于value值的文档 $lt 小于 $lte 小于等于 $gte 大于等于 $ne 不等于
- 包含和不包含
db.集合名.find({_id:{$in:["1","2","3"]}}) db.集合名.find({_id:{$nin:["1","2","3"]}})
- 条件连接
$and:[{},{},{}] // 查询id 大于1000,小于2000的文档 db.集合名.find({$and:[{_id:{$gte:1000}},{_id:{$lte:2000}}]}) $or:[{},{},{}]
- 实现列值的增长
db.集合名.update({_id:"12"},{$inc:{number:NumberInt(1)}})
- 按照某个字段排序
db.集合名.find({}).sort(字段:1) // 1是升序 db.集合名.find({}).sort(字段:-1) // -1是降序 // 先按照字段1升序, 如果字段1的值相同,按照字段2降序排序 db.集合名.find({}).sort(字段:1| 字段2:-1)