上一篇:MongoDB初次体验 下载安装与配置
mongodb是好用的非关系型数据库,可以以json对象的形式存储数据,这在web应用中有非常好的特性,且拥有良好的可拓展性。所以今天来总结一下如何用python的pymongo模块驱动mongodb,实现常见的增删查改操作。
pymongo所有操作都是同步的,等待结果时程序会阻塞。值得一提的是,mongodb速度要比mysql快很多。。。
通过
import pymongo
引入驱动模块。如果未安装,那么需要用pip进行安装,下面给出使用pip安装到对应的python版本
python -m pip install pymongo
如果是linux,那么别忘了加上sudo
,全局安装
sudo python -m pip install pymongo
使用pymongo.MongoClient
连接到数据库,并且获取数据库对象,其中参数是mongodb的地址
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
值得注意的是,整个mongoclient
就是一个巨大的map(或者说dict ?),可以通过索引来找到不同的数据库与集合。下面给出mongoclient
及其数据库与集合的架构
我们可以通过
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"] # 连接到数据库
col = db["testCollection"] # 获取集合
来连接到test
数据库的testCollection
集合,并且获取集合对象col
在mongodb中,无需特定的语句创建数据库。往指定的数据库与集合里面插入数据,如果数据库或集合不存在,那么将会被自动创建,这是好的。这意味着我们可以省略一些判断。
值得注意的是,必须插入至少一条语句,数据库与集合的创建才能生效。
运行如下代码在test数据库中新建testCollection的集合,并且插入一条数据
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
col.insert_one({"name": "TensorLee", "number": 114514})
在集合中插入数据,我们先要获取集合对象。这里我们沿用上文的,获取test
数据库的testCollection
集合
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
因为python中也有dict数据类型,类似json对象的表示方法,我们可以通过insert_one
方法,直接插入一个dict对象来表示插入的记录。
col.insert_one({"name": "student0", "number": 4396})
我们也可以通过insert_many
方法来插入许多对象,其中参数是一个list,里面每个元素是要插入的对象(dict)
col.insert_many(list)
下面的代码演示了两种插入方法:
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
col.insert_one({"name": "student0", "number": 4396})
list = [
{
"name": "student1",
"number": 10001
},
{
"name": "student2",
"number": 10002
},
{
"name": "student3",
"number": 10003
}
]
col.insert_many(list)
值得注意的是,这两个函数是有返回值的。返回插入文档的_id
字段(即mongodb的自带主键)
insert_one
函数的返回值是一个对象,其 inserted_id
属性是插入文档的_id
insert_many
函数的返回值是一个对象,其 inserted_ids
(比上面多个s) 属性是插入文档的_id
的数组(list)除此之外,返回的对象可以通过强制类型转换,转换为字符串。即id_str = str(id)
。下面的代码演示了如何获取返回值并且把它变成字符串(字符串数组)
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
ret = col.insert_one({"name": "student0", "number": 4396})
print('insert_one函数返回: ', str(ret.inserted_id))
list = [
{
"name": "student1",
"number": 10001
},
{
"name": "student2",
"number": 10002
},
{
"name": "student3",
"number": 10003
}
]
ret = col.insert_many(list)
retlist = []
for id in ret.inserted_ids:
retlist.append(str(id))
print('insert_many函数返回: ', retlist)
我们知道在mongodb的console中,通过find函数传入条件对象
的方式,可以指定查找的条件,比如
在pymongo中,也是同样,传入条件对象(dict)
即可快速查询。这里使用find_one
来返回单个查询结果
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
found = col.find_one({"number": 10001})
notfound = col.find_one({"number": 114514})
print(found)
print(notfound)
值得注意的是,如果存在,那么返回该对象(在python中表示为dict),如果不存在,返回None。结果如下:
如果使用find
而不是find_one
,那么会返回全部符合的记录
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
ret = col.find()
for i in ret:
print(i)
有时候我们没有必要获取整个记录的对象,而只用获取对象的某一属性,如果查询的是整个对象,那么浪费带宽。
find函数的第二个参数是字段条件筛选对象
,可以指定返回那些字段。比如我们只要number字段。
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
where = {
"name": "student0"
}
need = {
"_id": 0,
"number": 1
}
ret = col.find_one(where, need)
print(ret)
值得注意的是,除了 _id
属性,其他属性,只要未出现在need中,默认不选择。上述代码给出示例:除了number,其他都不要
当然也可以反选,即"number": 0
,那么未出现的属性,就默认选了。以下代码给出示例:除了name,其他都要
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
where = {
"name": "student0"
}
value = {
"name": 0,
}
ret = col.find_one(where, value)
print(ret)
在实际生产中,往往会存储复杂对象,比如对象的属性是另一个对象
obj = {
"name": "TensorLee",
"bodyState": {
"bloodType": "AB",
"shape": {
"height": "123cm",
"weight": "456kg"
}
}
}
这时候我们可以在条件指定中,通过 父对象.子对象
的方式来定位到要查找的字段。
比如我们要查找上述对象的 bodyState属性中的shape属性的height属性,我们就传bodyState.shape.height
即可
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
where = {
"bodyState.shape.height": "123cm"
}
ret = col.find_one(where)
print(ret)
和查询数据类似,我们指定where对象,即那些记录要被更新,然后指定value对象,即更新那些字段。值得注意的是,value对象的指定,和我们使用mongodb的JavaScript运行时控制台一样,需要指定$set 或 $inc
等指令
以下的代码将name
为student0
的第一条记录的number
字段改为7777
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
where = {
"name": "student0"
}
value = {
"$set": {
"number": 7777
}
}
col.update_one(where, value)
检查运行结果
指定 $inc
指令可以让数据字段自增(或者自减),以下的value对象指定了number字段增加10
value = {
"$inc": {
"number": 10
}
}
检查代码运行结果
如果使用 update 那么将更新所有匹配的记录,而不是只更新第一条记录。
使用delete_one 或者 delete_many
函数,用法和find函数类似,同样指定where对象即可。delete_many
会删除所有符合的记录。
使用如下代码删除所有number大于10000的记录
mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]
where = {
"number": {"$gt": 10000}
}
col.delete_many(where)