这篇文章主要从零开始介绍如何在Centos7下安装Mongodb, 用Python3连接Mongodb, 用可视化工具Robo 3T连接Mongodb, 之后介绍了一些基本的mongo操作方法, 其中含有一些进阶操作
安装Mongodb(Centos7)
- 官网上找到需要下载的版本压缩包进行下载,官网链接。或者在命令行下使用
wget
命令进行下载
1 | # 这里下载的是3.4.10版本 |
- 进行解压缩
1 | # 解压缩 |
- 进行相应的配置,mongodb默认没有任何配置
1 | # 进行mongodb主目录 |
- 启动mongodb
1 | # 以配置文件的方式启动 |
报错一:
ERROR: child process failed, exited with error number 1
检查mongodb.conf的文件路径是否配置错误
报错二:ERROR: child process failed, exited with error number 100
很可能是没有正常关闭导致的,那么可以删除
mongod.lock
文件,这里对应我的配置路径在data/
里面
- 其他
1 | # 链接命令,方便调用mongo命令 |
- 设置密码权限,默认无密码
1 | # 进行mongodb的交互环境 |
使用Python连接Mongodb
1 | # 下载第三方包 |
1 | # /usr/bin/python3 |
使用Robo 3t连接Mongodb
强烈推荐Robo 3t,官网地址
到官网找到对应的系统版本进行下载
安装
Windows的安装十分简单就不赘述了
Ubuntu的安装
1
2
3
4
5
6
7
8
9
10# 解压缩
tar -zxzf robomongo*.tar.gz
# 修改文件名(可选)
mv robomongo* robo3t
# 移动到/opt目录(可选)
mv robo3t /opt
# 建立软链接
ln -s /opt/robo3t/robomongo /usr/bin
# 启动
robomongo1
2
3
4
5
6
7
8
9
10
11
12
13# 如果报如下错误
`
This application failed to start because it could not find or load the Qt platform plugin "xcb" in "".
Available platform plugins are: xcb.
Reinstalling the application may fix this problem.
Aborted (core dumped)
`
# 解决办法
mkdir ~/robo-backup
mv /opt/robo3t/lib/libstdc++* ~/robo-backup/
# 之后便可以重新启动mongo试试看了
使用
- 首先创建新的连接,如下图所示。在
Connection中,``Name
为自定义连接名,Address
填入对应的host
和port
; - 在
Authentication
中,勾选Perform authentication
,填上对应的User Name
和Password
。填写完成之后可以点击Test
验证是否能够连接成功,如果无误的话,可以点击Save
保存退出。
- 连接Mongodb。点击
Connect
,之后就可以可视化数据库中的数据。也可以使用鼠标简单的进行创建/删除数据库,新建/修改信息,也可以使用命令查找数据。
- 首先创建新的连接,如下图所示。在
CURD操作(主要是查找数据)
CRUD
- C: Create Operations, 创建
- R: Read Operations, 读取
- U: Update Operations, 更新
- D: Delete Operations, 删除
mongo数据库至上而下是:Database
-->Collections
-->Documents
。我在这里分别理解成数据库、集合、记录。
这里直接用官方给的数据来操作。假设以下数据放在了fruits
集合中。
1 | { "_id": "apples", "qty": 5, "score": [-1, 3], "links": [{"Uin": 124, "NickName": "123"}]} |
基本操作
json
数据的嵌套查找,就是说,如果有字段包含json,可以直接用.
进行连接。
查找qty
中的ordered
为12的字段
1 | db.fruits.find({"qty.ordered": 12}) |
多重筛选,同时满足多个要求的记录
查找qty
为5,且_id
为"apples"的记录
1 | db.fruits.find({"qty": 5, "_id": "apples"}) |
第一个大括号内容表示筛选条件,第二个大括号表示显示内容
筛选条件就不说明了,第二个大括号表示打印_id
字段和score
字段,不打印其他字段,
1 | db.fruits.find({"qty": 5}, { "_id": 1 , "score": 1}) |
比较
下面至上而下分别表示,在fruits
集合中查找字段qty
与4的大小关系所有记录。
1 | db.fruits.find({"qty": 4}) # 等于 |
当然,也可以两个比较符一起操作,比如下面这样。
1 | db.fruits.find({"qty": {"$gt": 3, "$lt": 5}}) # 大于3小于5。 |
如果对score
这个字段使用比较,比如下面这样。
1 | db.fruits.find({"score": {"$gt": 2, "$lt": 5}}) # 大于3小于5。 |
将会返回下面两条记录。理由是,字段里的数组里有含有大于2小于5的数字。
1 | /* 1 */ |
关系
$in
查找_id
字段中包含5
或者ObjectId("507c35dd8fada716c89d0013")
的记录
1 | db.fruits.find({"_id": {"$in":[5, ObjectId("507c35dd8fada716c89d0013")] }}) |
$elemMatch
用于字段中含有数组,且数组中含有json
数据的的查找。
查找links
这个含有数组的字段,找出数组中Uin
等于124的记录
1 | db.fruits.find({"links": {"$elemMatch": {"Uin": 124}}}) |
$slice
切片,只打印字段中数组前n个数据
筛选出记录之后,只打印记录score
字段的前1条数据
1 | db.fruits.find({"qty": 5}, {"_id": 1, "score": {"$slice": 1}}) |
输出如下
1 | /* 1 */ |
$regex
使用正则表达式,更多操作请查看官方文档: $regex
找出_id
字段中所有以a开头的记录
1 | db.fruits.find({"_id": {"$regex": "^a"}}) |
后缀
sort——排序
1 | db.fruits.find().sort({"qty": 1}) # 升序 |
limit——限制
1 | db.fruits.find().limit(3) # 对查询结果只输出前3个,可以加在sort后面结合使用 |
skip——跳过
1 | db.fruits.find().skip(3) # 对查询结果跳过输出前3个,即不输出前3个,可以加在sort后面结合使用 |
count——计数
1 | db.fruits.find().count() # 返回查询结果总数 |
collation——基于特定语言进行操作
没有怎么看懂,我理解的大概意思就是说,运行根据特定语言来进行查找。感觉用的不多,这里贴上官方给的例子
1 | db.fruits.find().collation( { locale: "en_US", strength: 1 } ) |
个人常用操作
例子: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// test_db
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"links" : [{
"UserName" : "@a1bf7a55ad8478017b95124774687769",
"Uin" : 12266535,
"NickName" : "一二三",
},
{
"UserName" : "@5571e120b5d8f54f93338c76f62b9c419b818c29373dca9f331c2911a203bfbe",
"Uin" : NumberLong(3379331828),
"NickName" : "灵灵八",
}]
}
返回查找结果的数目
1 | db.test_db.find({"title": "MongoDB 教程"}).count() |
查找某个key中的数组是否某包含某内容
1 | db.test_db.find({"tags": {"$in": ["mongodb"]}}) |
使用正则进行查找
1 | db.test_db.find({"url": {"$regex": "^http"}}) |
查找某个由数组构成的key方法
1 | db.test_db.find({"links":{"$elemMatch":{"Uin":12266535,"NickName":"一二三"}}}) |
附录
数据库权限说明表
名称 | 权限 |
---|---|
数据库用户角色 | read、readWrite |
数据库管理角色 | dbAdmin、dbOwner、userAdmin |
集群管理角色 | clusterAdmin、clusterManager、clusterMonitor、hostManager |
备份恢复角色 | backup、restore |
所有数据库角色 | readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase |
超级用户角色 | root |
提供了系统超级用户的访问 | dbOwner 、userAdmin、userAdminAnyDatabase |
内部角色 | __system |
下一篇:Mongodb:副本集配置