mongodb 使用笔记
linux 下安装 mongodb
下载二进制文件后,终端输入:
sh
## 不使用配制文件启动
./bin/mongod -auth --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --logappend --port=27017 --fork
补充
官方提供 deb
等二进制包,可以使用。
修改配制文件
修改 /etc/mongod.conf
sh
## mongod.conf
## for documentation of all options, see:
## http://docs.mongodb.org/manual/reference/configuration-options/
## Where and how to store data.
storage:
dbPath: /home/junlsoft/mongodb/data
journal:
enabled: true
## engine:
## mmapv1:
## wiredTiger:
## where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/junlsoft/mongodb/logs
## network interfaces
net:
port: 27017
bindIp: 0.0.0.0
## how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
fork: true
security:
authorization: enabled
#operationProfiling:
#replication:
#sharding:
### Enterprise-Only Options:
#auditLog:
#snmp:
使用配置文件启动
sh
mongod --config /etc/mongod.conf
GUI 工具推荐
- robo3t(轻量,免费)
- 3t studio(重量,收费)
- dbKoda(重量,免费)
备份与恢复
利用 bin
下的 mongodump
和 mongorestore
备份
sh
[root@localhost bin]## ./mongodump -d my_mongodb
connected to: 127.0.0.1
DATABASE: my_mongodb to dump/my_mongodb
my_mongodb.system.indexes to dump/my_mongodb/system.indexes.bson
1 objects
my_mongodb.user to dump/my_mongodb/user.bson
2 objects
[root@localhost bin]## ll
总计 67648
-rwxr-xr-x 1 root root 7508756 2011-04-06 bsondump
drwxr-xr-x 3 root root 4096 04-10 23:54 dump
-rwxr-xr-x 1 root root 2978016 2011-04-06 mongo
恢复
sh
[root@localhost bin]## ./mongorestore -d my_mongodb my_mongodb_dump/
connected to: 127.0.0.1
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/user.bson
Wed Apr 11 00:03:03 going into namespace [my_mongodb.user]
Wed Apr 11 00:03:03 2 objects found
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/system.indexes.bson
Wed Apr 11 00:03:03 going into namespace [my_mongodb.system.indexes]
Wed Apr 11 00:03:03 { name: "_id_", ns: "my_mongodb.user", key: { _id: 1 }, v: 0 }
Wed Apr 11 00:03:03 1 objects found
[root@localhost bin]#
导出
sh
## -d:数据库名
## -c:集合名称
## -o : 导出数据文件的路径
## -type : 导出数据类型,默认json
mongoexport -d dbname -c collectionname -o filepath --type json/csv -f field
导入
sh
## -d:数据库名
## -c:集合名称
## --file : 选择导入的文件
## -type : 文件类型,默认json
## -f : 字段,type为csv是必须设置此项
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
新建用户无法授权登录
千万不要相信 robo3t
自带的权限可视化操作,这是元凶。 千万不要相信 robo3t
自带的权限可视化操作,这是元凶。 千万不要相信 robo3t
自带的权限可视化操作,这是元凶。
根本原因是 mongodb 加入了 SCRAM-SHA-1 校验方式
删除原来的用户后用 shell
创建:
js
db.createUser({ user: "admin", pwd: "admin", roles: ["root"] });
登录 shell
可以用:
sh
mongo admin -u root -p 123456
复杂查询和数据聚合
普通查询这里不做阐述,看看文档很容易理解。这里主要讲一些高级查询。
用 $lookup 进行联合查询
例如
json
// member
{
"_id": ObjectId("5b803abf3beda646c35c0504"),
"name": "测试用户",
"role": "admin",
"sex": "男",
"password": "0"
}
json
// project
{
"projectName": "AAA",
"createDate": "2018-08-25",
"memberId": ObjectId("5b803abf3beda646c35c0504")
}
如果要查询 project 的时候带出 member 的数据
js
db.getCollection("project").aggregate([
{
$match: { projectName: projectName },
},
{
$lookup: {
from: "member",
localField: "memberId",
foreignField: "_id",
as: "memberDetail",
},
},
]);
用 $sort 进行排序
js
db.getCollection('project').aggregate([
{
$match: { "projectName": projectName }
},
{
$lookup: {
from: "member",
localField: "memberId",
foreignField: "_id",
as: "memberDetail"
}
},
{
$sort: { createDate: -1 }
}
])
用 $limit 进行限制条数
js
db.getCollection('project').aggregate([
{
$match: { "projectName": projectName }
},
{
$lookup: {
from: "member",
localField: "memberId",
foreignField: "_id",
as: "memberDetail"
}
},
{
$sort: { createDate: -1 }
},
{
$limit: 10
}
])
TIP
$limit 可以与 $skip 配合,达到分页查询的效果。
用 $unwind 扁平化数据
json
[{
"_id": ObjectId("5b803b0a3beda646c35c050b"),
"projectName": "测试项目",
"startTime": 0,
"endTime": 0,
"desc": "描述",
"members": [ObjectId("5b803abf3beda646c35c0504"), ObjectId("5b803ef73beda646c35c05a6")]
},
{
"_id": ObjectId("5b8041043beda646c35c0609"),
"projectName": "测试项目2",
"startTime": 0,
"endTime": 0,
"desc": "描述",
"members": [ObjectId("5b803ef73beda646c35c05a6")]
}]
扁平化处理:
js
db.getCollection("project").aggregate([
{
$unwind: "$members",
},
]);
输出结果:
json
[{
"_id": ObjectId("5b803b0a3beda646c35c050b"),
"projectName": "测试项目",
"startTime": 0,
"endTime": 0,
"desc": "描述",
"members": ObjectId("5b803abf3beda646c35c0504")
},
{
"_id": ObjectId("5b803b0a3beda646c35c050b"),
"projectName": "测试项目",
"startTime": 0,
"endTime": 0,
"desc": "描述",
"members": ObjectId("5b803ef73beda646c35c05a6")
},
{
"_id": ObjectId("5b8041043beda646c35c0609"),
"projectName": "测试项目2",
"startTime": 0,
"endTime": 0,
"desc": "描述",
"members": ObjectId("5b803ef73beda646c35c05a6")
}]
复杂数据插入
插入到子集合
例如如下结构:
json
// project
{
"projectName": "AAA",
"createDate": "2018-08-25",
"tags": ["tag1", "tag2"]
}
如果要插入一个 "tag3" 操作方式如下:
js
project.update(
{ projectName: "AAA" },
{
$addToSet: {
tags: "tag3",
},
}
);
结果:
json
// project
{
"projectName": "AAA",
"createDate": "2018-08-25",
"tags": ["tag1", "tag2", "tag3"]
}
插入到子集合的子集合
例如如下结构:
json
// project
{
"projectName": "AAA",
"createDate": "2018-08-25",
"children": [
{
"name": "BBB",
"children": ["A", "B"]
}
]
}
如果要插入一个 "C" 操作方式如下:
js
project.update(
{ "children.name": "BBB" },
{
$addToSet: {
"children.$.children": "C",
},
}
);
结果:
json
// project
{
"projectName": "AAA",
"createDate": "2018-08-25",
"children": [
{
"name": "BBB",
"children": ["A", "B", "C"]
}
]
}