MongoDB
连接
options:
- retryWrites=true&w=majority 可以重写
连接
- 自建服务器
格式:
mongodb://[<user:password>]@<IP>:<post>/database?[oprions]
示例:
mongodb://root:msd@152.32.186.251:27017/?retryWrites=true&w=majority
- MongoDB集群
格式:
mongodb+srv://root:<password>@<分配给你的数据库>/?[options]
示例:
mongodb+srv://root:msdnm@cluster0.1zprm.mongodb.net/?retryWrites=true&w=majority
连接到数据库
数据库操作
- 显示所有的数据库
show dbs
show databases
- 查看当前所在的的数据库
db
- 创建并使用数据库
use <database>
- 创建root账户 参考
use admin
db.createUser(
{
user: 'root',
pwd: 'admin',
roles:[ { role: 'root', db: 'admin' } ]
}
)
- 创建用户 角色权限参考
db.createUser(
{
user: '<用户名>',
pwd: '<密码>',
roles:[ { role: '<用户名>', db: '<授予的数据库>' } ]
}
)
修改Mongodb配置文件
docker exec -it <mongo_image> /bin/bash
vi /etc/mongod.conf
备份数据
语法:
mongodump -h dbhost -d dbname -o dbdirectory
- -h: MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
- -d: 需要备份的数据库实例,例如:test
- -o: 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目里面存放该数据库实例的备份数据。
<linux host>:
mkdir -p <back_file_dir>
docker exec -it<mongo_image> /bin/bash
<docker_img>:
mongodump -h 127.0.0.1 --port 27017 -d <db_name> -o <back_dir>
数据恢复
mongorestore 命令来恢复备份的数据。
语法:
mongorestore -h <hostname><:port> -d dbname <path>
-
--host:port, -h:port: MongoDB所在服务器地址,默认为: localhost:27017
-
--db, -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
-
--drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
-
path:
不能同时指定 path 和 --dir 选项,--dir也可以设置备份目录。 mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
- --dir:
不能同时指定 path 和 --dir 选项
指定备份的目录
- 删除数据库
// 进入到要删除的数据库
db.dropDatabase()
集合(表)操作
- 创建表 语法
db.createCollection('<table>',[options])
选项
[options] capped:布尔值 固定大小的集合 size:数值 大小(字节) max:数组 最大条数
- 删除表 语法
db.<表>.drop()
增加(插入)insert
- 插入单条数据 语法:
db.<集合>.insert({"<key>":"<value>"})
db.<表>.insert([
{"<key1>":"<value1>"},
{"<key2>":"<value2>"}
])
- 插入多条数据 语法:
db.<集合>.insertMany([ {"<key1>":"<value1>"},
{"<key2>":"<value2>"}, ...])
- 脚本操作数据
for(let i=0;i<10;i++){
db.<集合>.insert({name:'user'+i })
}
查询
联合查询
在需要联合查询的主表中返回子表, 使用管道aggregate $lookup: 管道加入一次查找 form: 关联的表 localField: 本表的字段名 form`
db.college.aggregate([
{
$lookup:{
from:"specialty",
localField:"name",
foreignField:"college",
as:"college_list"
}
}
])
语法:
db.<表>.find(query,options)
- 全部查询(默认返回前20条),使用`it`查看下一组数据
```sql
db.<表>.find()
查找数组是否包含某个值
$in
$in: 查找数组是否包含某个值
语法:
db.coll.find( `<Arr>`: { $in : `[query]` } )
- Arr: 数组
- query: 查询的值, 可包含多个
示例:
db.user_room.insertOne({
"user_identity":["bc83108c977248daad2f3f815d25cfe5","d22e9e82fab041cc8f8d57d51d6b802d"]
})
db.user_room.findOne({ user_identity : { $in: ["bc83108c977248daad2f3f815d25cfe5"] }})
模糊查询
通过JS正则表达式实现
db.<表>.find({ <字段>: /<模糊查询值>/ })
示例:
--测试数据
db.users.insert({ "_id" : ObjectId("62de51a37c9c74a632447881"), "name" : "n1_6", "age" : 32 },{ "_id" : 6, "name" : "n2_6", "age" : 31 },{ "_id" : 2, "name" : "n2_1", "age" : 18 })
> db.users.find({name:/6/})
-- 返回结果
-> { "_id" : ObjectId("62de51a37c9c74a632447881"), "name" : "n1_6", "age" : 32 }
-> { "_id" : 6, "name" : "n2_6", "age" : 31 }
- 返回指定字段
1: 返回该字段0: 不返回该字段 语法:
find({}, {<key1>: <1 | 0>, <key2>: <1 | 0>})
TIP
0与1不能同时使用!
示例:
只返回list集合的age字段,不返回name字段
db.list.find({},{name: 0})
分页查询
语法:
skip(start): 起始位置, 数值
limit(pageNum): 每页要显示的数据, 数值
示例: 返回排序好的id与name值,并且从第1条数据开始显示10条数据
dn.list.find().sort({_id:1,name:1}).skip(0).limit(10)
文档总条数count()
示例:
查询list文档字段的总条数
[[API设计]]
db.list.find().count()
db.list.count().find()
条件查询:
| 条件 | 代码 | 符号表示 |
|---|---|---|
| 小于 | $lt | < |
| 小于或等于 | $lte | <= |
| 大于 | $gt | > |
| 大于或等于 | $gte | >= |
| 不等于 | $ne | != |
| 等于 | : | = |
| 数组长度大于等于 | $size |
与查询
使用,分割要查询的条件
db.<集合>.find(
{<字段1>: {<条件>: 值1}},
{<字段2>: {<条件>: 值2}},
...
)
示例:
db.<集合>.find(
{age: {$gt: 20}},
{_id: {$lte: 10}}
)
TIP 如果两个字段相同,只会取最后的字段的结果
或查询
db.<集合>.find(
$or: [
{<字段1>: {<条件>: 值1}},
{<字段2>: {<条件>: 值2}},
\]
...
)
示例:
db.users.find(
$or: [
{age: {$gt: 20}},
{_id: {$lte: 10}}
\]
...
)
TIP 如果两个字段相同,只会取最后的字段的结果
- 与或条件结合
db.<集合>.find(
{
{ <字段1>: {<条件>: 值1}, ... },
{
$or: [
{<字段1>: {<条件>: 值1}},
{<字段2>: {<