本文主要记录Pymongo基本操作,部分地方讲述Pymongo与mongo shell的区别
一、连接数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from pymongo import MongoClient # 创建客户端连接数据库 client = MongoClient('mongodb://用户名:密码@ip:端口/') # 选择数据库 db = client['数据库名'] # 选择集合(类似于mysql中的table) collection = db['集合名'] # 查找 data = collection.find() # pymongo.cursor.Cursor object print(data) # 遍历取出结果 for result in data: print(result) |
二、查
查询多条
1 2 3 4 5 6 7 |
# 查询多条 data = collection.find() # 笔者习惯将结果放入列表 list1 = [] for result in data: list1.append(result) |
查询单条
1 2 3 4 5 |
# 查询单条 data = collection.find_one() # find_one可直接获得结果 print(data) |
查询条件
1 2 3 4 5 6 7 8 9 10 11 |
# 第一个{}按字段内容限制查询条件,第二个{}按哪个字段限制查询条件 data = collection.find({"student":"李白"},{"student":1,"age":1}) # 第二个{}可以用 0 表示忽略某字段。但是 0 1 不可混用 data = collection.find({"student":"李白"},{"school":0}) # 第一个{}进阶使用:$exists :homework数组第二个元素存在 data = collection.find({"homework.1": {'$exists': True}}) # 第一个{}进阶使用:$elemMatch $ne:遍历取出homework数组中score不等于1的元素 data = collection.find({"homework": {'$elemMatch': {'score': {'$ne': 1}}}}) # 其他关键字 "$ne" "$eq" "$in" "$nin" "$gt" "$gte" "$lt" "$lte" "$and" "$nor" "$not" "$or" |
limit sort count限制条件
1 2 3 4 5 6 7 |
# limit限制查询个数 data = collection.find("student":"李白").limit(1) # count计数 data = collection.find("student":"李白").count() # sort按某字段顺序查找 按date倒序查找 mongo shell操作写法为.sort({"date":-1}) data = collection.find("student":"李白").sort([("date",-1)]) |
$ 操作符
$是他自己的意思,代表按条件找出的数组里面某项他自己
1 2 3 |
# homework.$对应这一条数据中homework.score不等于1的元素,相当于查到这条数据中符合条件的部分元素 data = collection.find_one({"student":"李白", "homework": {'$elemMatch': {'score': {'$ne': 1}}}},{'homework.$': 1, 'patient': 1, 'date': 1}) |
三、增
1 2 3 4 |
# 插入insert_one 或 insert,执行后返回_id Id = collection.insert_one(result) Id = collection.insert(result) |
四、删
1 2 3 4 5 6 7 8 9 10 11 12 |
result = collection.remove({'name': '李白'}) # 返回 删除数量 print(result) # delete_one删除满足条件的第一条 delete_many删除满足条件的所有数据 result = collection.delete_one({'name': '李白'}) # 返回pymongo.results.DeleteResult object调用deleted_count属性查看删除数量 print(result) print(result.deleted_count) result = collection.delete_many({'age': {'$lt': 25}}) print(result.deleted_count) |
运行结果如下:
1 2 3 4 5 |
{'ok': 1, 'n': 1} <pymongo.results.DeleteResult object at 0x10e6ba4c8> 1 4 |
五、改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# update_one 和 update_many result = collection.update_one({'name': '李白'}, {'$set': student}) print(result) # 匹配的数据条数和影响的数据条数 print(result.matched_count, result.modified_count) # update_many result = collection.update_many({'name': '李白'}, {'$set': student}) # 复杂条件 collection.update_one({'_id': data['_id'], 'homework': {'$elemMatch': {'score': {'$ne': 2}, '_id': homework_id}}}, {'$set': {'homework.$.score': 2}}) # $set更新字段,若没有则添加 $unset删除字段 # $push 把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去 { $push : { field : value } } # $pushAll同$push,只是一次可以追加多个值到一个数组字段内 { $pushAll : { field : value_array } } # $addToSet增加一个值到数组内,而且只有当这个值不在数组内才增加 { $addToSet : { field : value } } # $pop删除数组内的一个值 1删除最后一个值 -1删除第一个值 { $pop : { field : -1 } } # $pull从数组field内删除一个等于value值 { $pull : { field : value } } # $pullAll同$pull,可以一次删除数组内的多个值 { $pullAll : { field : value_array } } |
运行结果如下:
1 2 3 |
<pymongo.results.UpdateResult object at 0x10d17b678> 1 0 |
六、其他操作
create_index() create_indexes() drop_index()
find_one_and_delete() find_one_and_replace() find_one_and_update()
备注1:ObjectId可使用bson包
1 2 3 |
from bson import ObjectId ObjectId('5dff6e8b3a03f6efb213efb0') |
时间可使用datetime包
1 2 3 4 5 6 7 8 9 10 |
import datetime { "$gte" : datetime.datetime(2019, 7, 31, 0, 0)} # pymongo查询不会自动加时区,可自行补充时区时间 from datetime import datetime,timedelta for result in list1: # 北京时区相比于格林尼治时间(世界时)加8h result['date'] = result['date'] + timedelta(hours=8) # mongo shell中时间格式为 { "$gte" : ISODate("2019-01-01T00:00:00Z")} |
备注2:pymongo增删改查大致与mongo shell相同,pymongo中类似$eq等关键字需要加引号,mongodb shell不需要。pymongo中单引号双引号相同,mongo shell中需要使用双引号。