MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。
pymongo
提供了mongdb和python交互的所有方法.
pymongo官方文档或源代码:PyMongo — MongoDB Drivers
1、pymongo安装安装方式:
pip install pymongo
数据库和集合能够自动创建
2.2 无需权限认证的方式创建连接对象以及集合操作对象from pymongo import MongoClient
client = MongoClient(host,port) # 如果是本地连接host,port参数可以省略
collection = client[db名][集合名]
# collection = client.db名.集合名 # 与上边用法相同
2.3 需要权限认证的方式创建连接对象以及集合操作对象
from pymongo import MongoClient
# 创建数据库连接对象
client = MongoClient('host', 27017)
# 选择一个数据库
db = client['admin']
# 数据库中开了权限认证后,需要下一行代码
# 输入超级管理员账号和密码
db.authenticate('python', 'python')
# 选择一个集合,没有的话会新建的
col = client['pydata']['test']
from pymongo import MongoClient
my_client = MongoClient('192.168.124.49:27017')
my_db = my_client['admin']
print(my_db)
my_db.authenticate('root', '88888888')
my_col = my_client['test-mongo']['test_col']
print(my_col)
也可以这样写:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
3、创建数据库
3.1 创建一个数据库
创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
print(my_db)
运行结果:
注意: 在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
3.2 判断数据库是否已经存在可以读取 MongoDB 中的所有数据库,并判断指定的数据库是否存在。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
# my_db = my_client['test-mongo']
# print(my_db)
db_list = my_client.list_database_names()
print(db_list)
if "test-mongo" in db_list:
print('数据库已经存在!')
运行结果:
注意:database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()。
4、创建集合MongoDB 中的集合类似 SQL 的表。
4.1 创建一个集合MongoDB 使用数据库对象来创建集合。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
print(my_db)
my_col = my_db['test_col']
print(my_col)
运行结果:
注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
注意:数据库创建和集合创建后,需要在集合(数据表)中插入一个文档(记录),数据库才会真正创建。
4.2 判断集合是否已经存在可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
# my_col = my_db['test_col']
# print(my_col)
col_list = my_db.list_collection_names()
print(col_list)
if 'test_col' in col_list:
print("集合已经存在!")
运行结果:
注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。
5、mongodb添加数据MongoDB 中的一个文档类似 SQL 表中的一条记录。
5.1 插入集合集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典键值对。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
dic = {'name': 'dgw', 'age': 26, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
运行结果:
insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
如果在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id。
示例代码1:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
dic = {'name': 'dgw2', 'age': 27, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
print(data.inserted_id)
运行结果:
示例代码2:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
dic = {'_id': '666666', 'name': 'dgw2', 'age': 27, 'sex': '男'}
data = my_col.insert_one(dic)
print(data)
print(data.inserted_id)
运行结果:
集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。
insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
col_list = [
{'name': 'dgw1', 'age': 27, 'sex': '男'},
{'name': 'dgw2', 'age': 26, 'sex': '男'},
{'name': 'dgw3', 'age': 25, 'sex': '男'},
{'name': 'dgw4', 'age': 28, 'sex': '男'}
]
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)
运行结果:
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
col_list = [
{'_id': '1', 'name': 'dgw1', 'age': 27, 'sex': '男'},
{'_id': '2', 'name': 'dgw2', 'age': 26, 'sex': '男'},
{'_id': '3', 'name': 'dgw3', 'age': 25, 'sex': '男'},
{'_id': '4', 'name': 'dgw4', 'age': 28, 'sex': '男'}
]
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)
运行结果:
insert()可以批量的插入数据列表,也可以插入一条数据。
inser()方法可能将会弃用!
语法结构如下:
collection.insert({一条数据})
collection.insert([{数据一},{数据二}])
示例代码1: 【插入一条文档】
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
doc = {'name': 'dgw', 'age': 27}
ret = my_col.insert(doc)
print(ret)
运行结果:
示例代码2: 【插入多条文档】
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
docs = [
{'name': 'dgw', 'age': 27},
{'name': 'dgw2', 'age': 26}
]
ret = my_col.insert(docs)
print(ret)
运行结果:
MongoDB 中使用了 find 和 find_one() 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。
接下来对test-mongo数据库中的test-col集合中的数据进行查询操作:
使用 find_one() 方法来查询集合中的一条数据。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
data = my_col.find_one()
print(data)
运行结果:
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。
返回所有满足条件的结果,如果条件为空,则返回全部。结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,但是只能够进行一次读取。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
datas = my_col.find()
for data in datas:
print(data)
运行结果:
使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
除了 _id,不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
注意:除了_id外,同时指定0和1会报错。
示例代码1:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
datas = my_col.find({}, {'_id': 0, 'name': 1, 'age': 1})
for data in datas:
print(data)
运行结果:
示例代码2:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
datas = my_col.find({}, {'name': 0})
for data in datas:
print(data)
运行结果:
在 find() 中设置参数来过滤数据。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
query = {'name': 'dgw2'}
# query = {'_id': '2'}
datas = my_col.find(query)
for data in datas:
print(data)
运行结果:
可以使用修饰符。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
# query = {'_id': {'$gt': '2'}}
# query = {'age': {'$gte': 27}}
query = {'name': {'$gte': 'dgw3'}}
# query = {'_id': '2'}
datas = my_col.find(query)
print(datas)
for data in datas:
print(data)
运行结果:
正则表达式修饰符只用于搜索字符串的字段。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
# query = {'name': {'$regex': '^d'}}
query = {'name': {'$regex': '3$'}}
datas = my_col.find(query)
print(datas)
for data in datas:
print(data)
运行结果:
对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
datas = my_col.find().limit(3)
print(datas)
for data in datas:
print(data)
运行结果:
对查询结果设置指定开始位置查询可以使用 skip() 方法,该方法只接受一个数字参数。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
datas = my_col.find().skip(3)
print(datas)
for data in datas:
print(data)
print("*" * 100)
datas2 = my_col.find().skip(3).limit(3)
print(datas2)
for data in datas2:
print(data)
运行结果:
sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
document = my_col.find().sort('age', -1)
for doc in document:
print(doc)
运行结果:
接下来对test-mongo数据库中的test-col集合中的数据进行修改操作:
使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。
update_one()是局部更新替换,只需要替换更新需要修改的字段即可。
示例代码1:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
query = {'_id': '1', 'name': 'dgw1'}
new_value = {'$set': {'age': 21}}
my_col.update_one(query, new_value)
datas = my_col.find()
for data in datas:
print(data)
运行结果:
示例代码2: 【使用db.update_one()更新一条数据】
from pymongo import MongoClient
client = MongoClient('127.0.0.1', 27017)
db = client['python_test']['students']
# print(db)
for data in db.find():
print(data)
print(data.values())
# 只需要放需要更新的字段,注意使用$进行操作
doument = {"$set": {'stu_no': 666666, 'age': 25}}
db.update_one({'stu_name': '张三'}, doument, upsert=True)
for data in db.find():
print(data)
运行结果:
示例代码:
from pymongo import MongoClient
client = MongoClient('127.0.0.1', 27017)
db = client['python_test']['students']
# print(db)
for data in db.find():
print(data)
print(data.values())
# replace_one要求是所有数据,少一个key-value则报错
doument = {'stu_no': 3790567, 'stu_name': '张三', 'address': '山东省青岛市', 'phone_no': '12345678910', 'age': 26}
db.replace_one({'stu_name': '张三'}, doument, upsert=True)
for data in db.find():
print(data)
运行结果:
update_many()是局部更新替换,只需要替换更新需要修改的字段即可。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
# query = {'name': {'$regex': '^d'}}
query = {'name': 'dgw1'}
new_value = {'$set': {'age': 23}}
num = my_col.update_many(query, new_value)
datas = my_col.find()
for data in datas:
print(data)
print(f"已经更新{num.matched_count}条文档!")
运行结果:
update()更新数据(全文档覆盖或指定键值,更新一条或多条)。
update()方法将会被弃掉,使用update_one()、update_many()和replace_one()取代。
语法结构:
collection.update({条件}, {'$set':{指定的kv或完整的一条数据}}, multi=False/True, upsert=False/True)
参数说明:
- multi参数:默认为False,表示更新一条; multi=True则更新多条。
- multi参数必须和$set一起使用
- upsert参数:默认为False,upsert=True则先查询是否存在,存在则更新;不存在就插入
- $set表示指定字段进行更新
示例代码1: 【插入一条数据】【存在就更新,不存在就插入】
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
doc = {"age": 36}
ret = my_col.update({'_id': '2'}, {"$set": doc}, upsert=True)
print(ret)
运行结果:
示例代码2: 【插入多条数据】【存在就更新,不存在就插入】
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
doc = {"age": 35}
ret = my_col.update({'name': 'dgw2'}, {"$set": doc}, multi=True, upsert=True)
print(ret)
运行结果:
接下来对test-mongo数据库中的test-col集合中的数据进行删除操作:
使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
如果查询到多条数据,只会删除查询到的第一条数据。
示例代码1:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
query = {'_id': '1', 'name': 'dgw1'}
my_col.delete_one(query)
document = my_col.find()
for doc in document:
print(doc)
运行结果:
示例代码2:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
query = {'name': 'dgw2'}
my_col.delete_one(query)
document = my_col.find()
for doc in document:
print(doc)
运行结果:
使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
# query = {'name': {'$regex': '^d'}}
query = {'name': 'dgw2'}
num = my_col.delete_many(query)
document = my_col.find()
for doc in document:
print(doc)
print(f"{num.deleted_count}个文档已经被删除!")
运行结果:
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
num = my_col.delete_many({})
document = my_col.find()
for doc in document:
print(doc)
print(f"{num.deleted_count}个文档已经被删除!")
运行结果:
使用 drop() 方法来删除一个集合。
示例代码:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
my_col.drop()
参考博文:
Python MongoDB | 菜鸟教程
Python Mongodb 插入文档 | 菜鸟教程
Python Mongodb 查询文档 | 菜鸟教程
Python Mongodb 修改文档 | 菜鸟教程
Python MongoDB 排序 | 菜鸟教程
Python Mongodb 删除数据 | 菜鸟教程
附录:
添加数据:
from pymongo import MongoClient
my_client = MongoClient('mongodb://root:88888888@192.168.124.49:27017')
my_db = my_client['test-mongo']
# print(my_db)
my_col = my_db['test_col']
# print(my_col)
col_list = [
{'name': 'dgw1', 'age': 27, 'sex': '男'},
{'name': 'dgw2', 'age': 26, 'sex': '男'},
{'name': 'dgw3', 'age': 25, 'sex': '男'},
{'name': 'dgw4', 'age': 28, 'sex': '男'},
{'_id': '1', 'name': 'dgw1', 'age': 27, 'sex': '男'},
{'_id': '2', 'name': 'dgw2', 'age': 26, 'sex': '男'},
{'_id': '3', 'name': 'dgw3', 'age': 25, 'sex': '男'},
{'_id': '4', 'name': 'dgw4', 'age': 28, 'sex': '男'}
]
# 插入多条数据
data = my_col.insert_many(col_list)
print(data)
print(data.inserted_ids)