使用Python操作Mongodb需要使用第三方库PyMongo,这里使用pip进行安装:
pip install pymongo
PyMongo操作Mongodb需要初始化数据库连接,例如:
①当Mongodb运行在本机,且没有修改端口号和添加账号密码时,不需要传入参数,直接使用 client = MongoClient() 获取连接
from pymongo import MongoClient
client = MongoClient()
②其他情况下,需要传入具体参数进行连接,参数的格式如下:
"mongodb://用户名:密码@服务器IP或域名:端口号"
from pymongo import MongoClient
client = MongoClient("mongodb://admin:123456@192.168.178.133:27017")
获取到连接后就可以操作数据库了,指定具体操作的库和指定的集合有两种方式:
方式一:
from pymongo import MongoClient
client = MongoClient()
database = client.Mongodb中将要操作的数据库名
collection = database.Mongodb中将要操作的集合名
方式二:
from pymongo import MongoClient
client = MongoClient()
database_name = "Mongodb中将要操作的数据库名"
collection_name = "Mongodb中将要操作的集合名"
database = client[database_name]
myCollection = database[collection_name]
例如,使用方式一连接mongodb数据库中的 test 库下的 students 集合:
from pymongo import MongoClient
client = MongoClient()
database = client.test
collection = database.students
使用方式二连接mongodb数据库中的 test 库下的 students 集合:
from pymongo import MongoClient
client = MongoClient()
database_name = "test"
collection_name = "students"
database = client[database_name]
collection = database[collection_name]
指定了库和集合获取到collection对象后,即可以对集合进行增删改查等操作了,需要注意的是,如果当前使用的库或集合在mongodb中并不存在时,在调用插入方法之后,PyMongo会自动创建对应的库或集合。
插入数据操作:
语法格式:insert_one({key:value}) 一次插入一条数据:
collection.insert_one({"name":"张三","gander":"男","age":20,"address":{"province":"广东省","city":"深圳"},"hobby":["爬山","游泳"]})
语法格式:insert_many([{key:value},{key:value}...]) 一次插入多条数据:
students = [
{"name":"李四","gander":"男","age":21,"address":{"province":"广东省","city":"广州"},"hobby":["打球","唱歌","跳舞"]},
{"name":"小花","gander":"女","age":19,"address":{"province":"广东省","city":"阳江"},"hobby":["看电影","滑雪"]}
]
collection.insert_many(students)
查询数据操作:
语法格式:
find({key:value},{key:value})
find()接收两个参数,第一个参数匹数用于配要查找的记录,第二个参数用于指定要返回该记录的哪些字段值;第二个参数为字典类型,其中的 key 为要返回的字段名称,value 只能是 0(不返回该字段值)或 1(返回该字段值)需要注意的是,如果指定有多个key-value,则只能全为 0 或全为 1(_id 字段除外,默认_id是必须返回的,如果不需要,则必须明确指出"_id":0),例如:
students = collection.find() # 返回所有记录
students = collection.find({"name":"张三"}) # 返回name为张三的记录
students = collection.find({"age":{"$gte":20}}) # 返回age大于或等于20的记录
其中的 $gte 为大于等于,类似的可替换为:$gt 大于、$lt 小于、$lte小于等于、 $ne不等于
默认情况下会返回符合条件记录的所有字段值,如果只想要获取该记录的部分字段值,则需要传入第二个参数进行指定,例如:
students = collection.find({},{"name":1,"address":1}) # 返回所有记录,并且只返回name和address字段的值
students = collection.find({},{"_id":0,"gander":0,"age":0}) # 返回所有记录,并且不返回_id、gander、age的值
如果要通过mongodb帮我们自动生成的_id的值进行匹配查询,则需要导入ObjectId这个类,例如:
from bson import ObjectId
students = collection.find({"_id":ObjectId("5d582c230cdc99ff55c4b627")}) # 查询_id为5d582c230cdc99ff55c4b627的记录
更新数据操作:
语法格式:
update_one({key:value},{"$set":{"要修改的字段名":"新的值"}},upsert=True或False) 修改第一条匹配到的记录
update_many({key:value},{"$set":{"要修改的字段名":"新的值"}},upsert=True或False) 修改所有匹配到的记录
第一个参数跟find()方法的第一个参数一样,用于匹配符合条件的记录;第二个参数也是一个字典,key为$set,值是需要更新的字段名和新值组成的字典;第三个参数upsert=True时,如果需要修改的记录不存在,则把$set对应的字典作为新的记录插入到数据库,upsert=False时,如果需要修改的记录不存在,则会抛出异常,例如:
collection.update_one({"name":"张三"},{"$set":{"age":"25"}},upsert=True) # 把name为张三的age改为25
collection.update_many({"gander":"男"},{"$set":{"address.city":"深圳"}},upsert=False) # 把所有gander为男的city改为深圳
注意这里的city字段,因为它是包含在address下的字典中的,所以要使用address.city的形式获取该字段
删除数据操作:
语法格式:
delete_one({key:value}) 删除匹配到的第一条记录
delete_many({key:value}) 删除所有匹配到的记录
参数是一个字典,跟find()方法的第一个参数一样,用于匹配符合条件的记录,例如:
collection.delete_one({"gander":"女"}) # 删除第一条匹配到的gander为女的记录
collection.delete_many({"gander":"男"}) # 删除所有gander为男的记录
其他操作:
count() 统计匹配到的记录有多少条 ,例如:
count = collection.find({"gander":"男"}).count() # 统计gander为男的记录有多少条
limit(num) 用于限定返回的条数
num:表示每次最多只返回num条数据,不足num条则有多少返回多少,例如:
students = collection.find().limit(2) # 每次只返回2条数据
skip(num) 用于跳过指定条数的记录
num:表示跳过匹配到的数据的前num条记录,例如:
students = collection.find().skip(2) # 跳过匹配到的记录的前2条数据
sort("用于排序的字段名",1或-1) 用于对返回结果进行排序
第一个参数:指定用于排序的字段的名称
第二个参数:取1或-1,1表示正序,-1表示倒序,例如:
students = collection.find().sort("age",1) # 将结果按age字段的值升序排序
distinct("字段名",{key:value}) 用于数据去重
第一个参数:表示对哪一个字段进行去重
第二个参数:跟find()方法的第一个参数一样 ,用于过滤满足条件的记录,例如:
student_names = collection.distinct("name",{}) # 匹配所有记录通过name字段值进行去重
注意,distinct()方法返回的只是第一个参数指定的字段的值,不会返回记录的其他字段的值