Python操作Mongodb

使用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()方法返回的只是第一个参数指定的字段的值,不会返回记录的其他字段的值

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值