Python基础之操作MongoDB数据库
一:docker-mongodb
# mongodb官方docker见
https://hub.docker.com/_/mongo
用到的文件如下:
root@eth:~/docker/mongodb# tree
.
├── docker-compose.yml
├── Dockerfile
└── setup
└── setup.js
docker-compose.yml文件内容如下:
root@eth:~/docker/mongodb# cat docker-compose.yml
version: '3.1'
services:
mongo:
build: ./
container_name: mongodb
restart: always
ports:
- 27017:27017
volumes:
#- ./setup:/docker-entrypoint-initdb.d/
- /data/mongodb_docker/data:/data/db/
environment: # admin账号和密码
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
# 如果不需要MongoDB的网页端,以下内容可以不加
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
ports:
- 8081:8081
environment: # 这里只能使用与上方MONGO_INITDB_ROOT_USERNAME相同的root账号
ME_CONFIG_MONGODB_ADMINUSERNAME: admin
ME_CONFIG_MONGODB_ADMINPASSWORD: admin
Dockerfile文件内容如下:
root@eth:~/docker/mongodb# cat Dockerfile
FROM mongo
# 将本地的setup.js拷贝到Docker容器中
COPY ./setup/setup.js /docker-entrypoint-initdb.d/
setup.js文件如下:
root@eth:~/docker/mongodb# cat setup/setup.js
db = db.getSiblingDB('newDB'); // 创建一个名为"newDB"的DB
db.createUser( // 创建一个名为"shon"的用户,设置密码和权限
{
user: "shon",
pwd: "shonlovescoding",
roles: [
{ role: "dbOwner", db: "newDB"}
]
}
);
db.createCollection("newCollection"); // 在"newDB"中创建一个名为"newCollection"的Collection
启动mongodb容器:
root@eth:~/docker/mongodb# docker-compose up -d
root@eth:~/docker/mongodb# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------
mongo-express tini -- /docker-entrypoint ... Up 0.0.0.0:8081->8081/tcp
mongodb docker-entrypoint.sh mongod Up 0.0.0.0:27017->27017/tcp
二:MongoDB介绍
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table | joins | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB三元素:
1:文档(document)–> 就是关系型数据库中的一行。文档是一个对象。由键值对构成,是json的扩展形式
{'name': 'abc', 'gender': '1'}
2:集合(collection)–> 就是关系型数据库中的表。可以存储多个文档,结构可以不固定。如可以存储如下文档在一个集合中
三:Mongodb数据类型
Object ID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (Python中的List)
Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
四:MongoDB基本操作命令
https://www.runoob.com/mongodb/mongodb-connections.html
五:python操作mongodb
5.1 安装pymongo
pip install pymongo
pymongo api文档:
http://api.mongodb.com/python/current/api/pymongo/collection.html
5.2 插入数据
client = pymongo.MongoClient('mongodb://admin:admin@172.17.2.36:27017/')
# 获取数据库,如果库不存在会自动创建
db = client.motest
# 获取数据库中的集合(也就是mysql中的表),如果集合不存在会自动创建
collection = db.qa
# 插入单条数据
# collection.insert_one({'username': 'Bruce Lee'})
# 插入多条数据
collection.insert_many([
{'username': 'Jet Lee', 'age': 20},
{'username': 'Stephen Chow', 'age': 30}
])
5.3 查询数据
查询多条数据:
import pymongo
client = pymongo.MongoClient('mongodb://admin:admin@172.17.2.36:27017/')
# 获取数据库,如果库不存在会自动创建
db = client.motest
# 获取数据库中的集合(也就是mysql中的表),如果集合不存在会自动创建
collection = db.qa
cursor = collection.find()
for x in cursor:
print(x)
# {'_id': ObjectId('5eb51d306100d798a4973df2'), 'username': 'Bruce Lee'}
# {'_id': ObjectId('5eb520fa134f92d54ab2283c'), 'username': 'Bruce Lee'}
# {'_id': ObjectId('5eb5221a943457c3517c5aa5'), 'username': 'Jet Lee', 'age': 20}
# {'_id': ObjectId('5eb5221a943457c3517c5aa6'), 'username': 'Stephen Chow', 'age': 30}
查询集合中第一条数据:
result = collection.find_one()
print(result)
后面也可以带查询条件:
result = collection.find_one({'username': 'Bruce Lee'})
print(result)
5.4 更新数据
更新单条数据:
# 将{'username': 'Bruce Lee'}的数据更新为{"username": 'aaa'}
result = collection.update_one({'username': 'Bruce Lee'}, {"$set": {"username": 'aaa'}})
print(result)
更新多条数据:
result = collection.update_many({'username': 'aaa'}, {"$set": {"username": 'bbbb'}})
print(result)
5.5 删除数据
result = collection.delete_one({'username': 'bbb'})
result = collection.delete_many({'username': 'bbb'})