文章目录
- 简单了解mongoDB
- 安装mongoDB,我的是5.0.12
- docker安装mongodb更加简单
- MongoDB基本操作及增删改查
- 可以进入bin目录打开命令行窗口 输入 .\mongo.exe url( 格式为'username:password@hostname/dbname' 默认localhost:27017)连接mongo,(不建议,没有提示)
- 使用mongoDBCompass操作,针对数据库集合文档的操作基本都可以通过工具操作,更加简单
- 创建数据库,删除数据库,查看数据库
- 创建集合,查看集合,删除集合
- 简单的文档crud
- 插入,删除
- 查询文档
- 针对字段不存在,空字符,null的查询;
- 修改文档
- springboot整合操作mongodb
- mongodb权限认证
简单了解mongoDB
官网:https://www.mongodb.com/docs/manual/introduction/ 中文文档:https://mongodb.net.cn/manual/introduction/
- MongoDB:是一个高效的非关系型数据库(不支持表关系:只能操作单表)
- MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson(json的扩展)格式(初学可以理解为就是json),因此可以存储比较复杂的数据类型。
- MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
针对mongoDB可以当做mysql来学习:
SQL术语 | MongoDB术语 |
database(数据库) | database(数据库) |
table(数据表) | database(数据库) |
database(数据库) | collection(集合) |
row(数据行) | document(文档) |
colunm(字段) | field(字段) |
index(索引) | index(索引) |
类似:
{
“_id”: {
“$numberLong”: “2”
},
“userName”: “郭风”,
“passWord”: “598”,
“_class”: “com.neo.model.User”
}
安装mongoDB,我的是5.0.12
可以通过db.version()查看版本
下载地址:https://www.mongodb.com/try/download/community
建议直接下载mongodb-windows-x86_64-5.0.12-signed.msi文件进行安装,然后可以安装mongoDBCompass(mongoDBCompass是一个操作mongodb的工具,很方便),
安装好后原本是没有配置文件夹,data文件夹,log文件夹的,这里我们需要自己手动创建这三个文件夹,并且要在data文件夹中在创建一个db文件夹;顾名思义,data是存放mongodb数据文件的,log日志,conf是配置文件;
在conf文件下新增配置文件mongod.conf
# mongod.conf
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
##The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: D:\server\mongodb-win32-x86_64-windows-5.0.12\data\db
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
# #The path of the log file to which mongod or mongos should send all diagnostic logging information destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: D:\server\mongodb-win32-x86_64-windows-5.0.12\log\mongod.log
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
destination: file
net:
#服务实例绑定的IP,默认是localhost服务器内网地址
bindIp: localhost
#bindIp
#绑定的端口,默认是27017
port: 27017
然后就可以启动mongodb了,在bin目录下进入命令行执行,进入log文件查看日志,控制台没有打印日志了,如果不配置日志信息,就会在控制台打印日志:
.\mongod.exe -f ..\conf\mongod.conf
访问: 127.0.0.1:27017
然后经过测试发现配置了日志的话就访问不到http://127.0.0.1:27017/,把日志注释掉就能访问,但是不能连着访问,连着访问就会拒绝掉;
docker安装mongodb更加简单
MongoDB基本操作及增删改查
可以进入bin目录打开命令行窗口 输入 .\mongo.exe url( 格式为’username:password@hostname/dbname’ 默认localhost:27017)连接mongo,(不建议,没有提示)
使用mongoDBCompass操作,针对数据库集合文档的操作基本都可以通过工具操作,更加简单
安装的时候只要安装了Compass,会在桌面创建快捷键,然后找到文件目录,我的是在:C:\Users\yida\AppData\Local目录下,因为在c盘,我直接把整个文件夹移到了跟mongo一起的地方.
启动直接连接本地的,本地的mongoDB服务cmd窗口不能关闭;
连接成功,点击左下角>_MONGOSH进入命令行;
mongo在创建(数据库)的时候,都不会显示的,只有数据库里面有文档才会显示,MongoDB默认数据库:test
进入mongo终端,没选择库,所有的操作都是对test库进行操作的。假如你的test数据库还没有内容,是不会出现在数据库列表的。
创建数据库,删除数据库,查看数据库
//查看所有数据库
show dbs
// 使用rdd数据库,没有就创建
use rdd
//查看当前数据库名称
db
// 删除当前的数据库
db.dropDatabase()
创建集合,查看集合,删除集合
在 MongoDB 中,你不需要显示创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
//创建rdd集合,创建集合可以传options参数,可以传固定大小,可以传最大值
db.createCollection("rdd")
// 固定大小为10的集合,最大为100,capped,(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
db.createCollection("rdd",{capped:true,size:10,max:100})
// 或者直接往集合aaa中插入文档,就自动创建集合aaa了
db.aaa.insertOne({username:"rdd"})
//查看集合
show collections
// 删除rdd集合
db.rdd.drop()
简单的文档crud
我这边整理一些简单的,更详细的参考官网:https://mongodb.net.cn/manual/crud/ 测试数据:
[
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]
插入,删除
// 插入文档,文档可以理解为json数据
db.test.insertOne({ item: "journal1", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" })
// 插入多条
db.test.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
])
// 删除文档,remove已经不推荐了.推荐使用delete
// 查询item=journal1的文档,可以多插入几条测试一下
db.test.find({item:"journal1"})
// 删除一条item=journal1的文档
db.test.deleteOne( { item: "journal1" } )
// 删除全部item=journal1的文档
db.test.deleteMany( { item: "journal1" } )
查询文档
//查询文档
//参数都是可选的,但是第二个参数依赖于第一个参数,不能单独出现,
//query 查询对象(条件)
//projection 指定查询的键(需要显示的 1:强调显示 0:强调不显示)。默认返回全部键。
db.collection.find(query,projection)
// 比如,查询item=journal的,id不显示,其余的显示
db.test.find({item:"journal"},{_id:0})
// 查询qty>=22 <26,status=A的数据,$and可以换成$or或者
db.test.find({$and: [{qty:{$lt: 26,$gte : 22}},{status:"A"}]})
// 当为and的时候可以等价于 ,当判断不等于$ne的时候有一点问题,判断不等于null,和不等于空字符串的时候,不知道为啥?
db.test.find({qty:{$lt: 26,$gt : 22},status:"A"})
db.test.find({$or: [{qty:{$lt: 26,$gte : 22}},{status:"A"}]})
// 查询item 在 ["paper","planner"]中的数据
db.test.find({item:{$in: ["paper","planner"]}})
分页查询:
// limit跟mysql是一样的只返回多少条数据,skip表示跳过几条数据
db.collection.find().limit(LIMIT).skip(SKIP).sort(SORT)
// 分页就是页码n ,页数 m
db.collection.find().limit(m).skip((n-1)*m)
// 查询根据qty正序,1正序,-1倒序
db.test.find().limit(2).skip(1).sort({qty:1})
嵌入文档,就是对象里面的对象:
db.collection.find({"key1.key2" 比较运算符 value})
// 查询size的h为10的数据
db.test.find({"size.h":10})
正则表达式查询:
// 查询item里面包含字母o的数据,忽略大小写
db.test.find({item: {$regex: /o/i }})
查找字段为指定数据类型的记录
//查找item字段为字符串的记录
db.test.find({item:{$type:2}})
针对字段不存在,空字符,null的查询;
// 构造测试数据
db.col00.insertMany([
{"name": "doc01 text是正常值", "text": "XXXX"},
{"name": "doc01 text是空串", "text": ""},
{"name": "doc02 text为null", "text": null},
{"name": "doc03 text不存在"}
])
// 查询属性text “存在” 同时“不等于null”,不等于空字符串的文档
db.col00.find({text:{$nin: ["",null]}})
// 这时候缩写就不行不知道为啥..知道的评论一下
db.col00.find({
"$and": [
{"text": {
"$ne": null
}}
,
{"text": {
"$ne": ""
}}
]
})
// 查询失败
db.col00.find({
"text": {
"$ne": null,"$ne": ''
}
})
// 查询属性text “不存在” 或者 “等于null”的文档
db.col00.find({
"text": null
})
db.col00.find({
"text": {
"$eq": null
}
})
// 查询属性text “存在” 或者 “不为null”的文档
db.col00.find({
"text": {
"$ne": null
}
})
// 查询属性text“不存在” 或者 “等于null” 或者 “等于空串” 的文档
db.col00.find({
"$or": [
{
"text": null
},
{
"text": ""
}
]
})
// 查询属性text“存在”的文档
db.col00.find({
"text": {
"$exists": true
}
})
// 查询属性text“不存在”的文档
db.col00.find({
"text": {
"$exists": false
}
})
// 总结:“null”包含“不存在”和“等于null”俩个概念
修改文档
$set指定更换字段,如果不写$set表示不通过修改器直接置换
// 将item为journal的一个文档的status设置为B,同上删除,updateOne,updateMany
db.test.updateOne({item:"journal"},{$set:{status:"B"}})
db.test.updateMany({item:"journal"},{$set:{status:"B"}})
// 查询item:"journal"
db.test.find({item:"journal"})
// 直接将item:"journal"的文档设置为{item:"journal",status:"B"},则要使用replaceOne
db.test.replaceOne({item:"journal"},{item:"journal",status:"B"})
// 删除item:"journal"
db.test.deleteOne({item:"journal"})
// 设置upsert为true,upsert 存在则更新,不存在则新增
db.test.updateOne({item:"journal"},{$set:{status:"B"}},{upsert:true})
db.test.replaceOne({item:"journal"},{item:"journal",status:"B"},{upsert:true})
// 新增字段status 直接 $set
db.test.updateOne({item:"journal"},{$set:{status:"A"}},{upsert:true})
//删除字段status $unset
db.test.updateOne({item:"journal"},{$unset:{status:""}},{upsert:true})
// 对没有新字段testAdd的数据新增testAdd数据,默认为空字符
db.test.updateMany({'testAdd':{'$exists':false}},{'$set':{'testAdd':''}})
springboot整合操作mongodb
mongodb权限认证