Pymongo简单使用
Pymongo安装
直接使用pip安装即可
pip install pymongo
连接Mongodb
MongoClient()方式(官方建议的新方法)
MongoClient对象:用于与MongoDB服务器建立连接
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
需要注意的是:从pymongo3.0版本开始,MongoClient的构造函数就不会再阻塞等待MongoDB连接的建立,即使连接不上也不会上报ConnectionFailure,用户提交的资格证书是错误的也不会上报ConfigurationError。相反,构造函数会立即返回并在后台线程中加载处理连接数据的进程。
也就是说,在使用pymongo时你需要确保自己的mongodb服务打开了,不然程序会在数据库的增删改操作中等待上相当长的时间。
Connection()方式(不建议使用)
connection = pymongo.Connection("192.168.1.2",27017)
MongoClient()和Connection()方法相差不大,最根本的区别在于Connection()方法的默认行为不同,connection()默认是瞬时完毕,不等server回应,而MongoClient()默认是安全操作,等server确认后才继续下一步操作。
正因为这点,所以Connection方法操作数据库要比MongoClient方法更快一些,但官方现在已经不推荐使用。
Pymongo添加文档
MongoDB 中的一个文档类似 SQL 表中的一条记录。
插入单条数据
集合中插入文档使用 insert_one() 方法,该方法的第一参数是键值对。
以下实例向 col 集合中插入文档:
x = mycol.insert_one({ "id": 1, "name": "valkyrie", "age": "20" })
print(x.inserted_id)
insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
插入多条数据
集合中插入多个文档使用 insert_many() 方法,使用方法与insert_one一样。
x = mycol.insert_many([
{'id': 1, 'name': 'valkyrie', 'age': 20},
{'id': 1, 'name': 'wangiia', 'age': 16}
])
insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
Pymongo删除文档
删除单条数据
可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
下例删除 name 字段值为 “wangiia” 的数据:
mycol.delete_one({ "name": "wangiia" })
删除多条数据
使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
下例删除所有 name 字段中以 v 开头的文档:
x = mycol.delete_many( { "name": {"$regex": "^v"} })
删除所有数据
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
x = mycol.delete_many({})
删除集合
用 drop() 方法来删除一个集合,下例删除了 mycol 集合:
mycol.drop()
如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。
Pymongo修改文档
单条数据修改
我们可以使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。若查找到的匹配数据多于一条,则只会修改第一条。
mycol.update_one({ "name": "valkyrie" }, { "$set": { "age": "16" } })
注意:使用$set操作符修改特定属性的值,否则会修改整个文档。
多条数据修改
update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。
x = mycol.update_many({ "name": "valkyrie" }, { "$set": { "age": "16" } })
print(x.modified_count)
update_many()方法返回 UpdateResult 对象,该对象包含 modified_count属性,它是更新文档数目的值。
Pymongo查询文档
查询单条数据
我们可以使用 find_one() 方法来查询集合中的一条数据
print(mycol.find_one())
查询所有数据
也可以使用 find()方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作
for x in mycol.find():
print(x)
其中,查询方法find()返回的对象为Cursor对象,用于进行多行数据的遍历
当调用集合对象的find()方法时,会返回Cursor对象,结合for…in…遍历cursor对象。
查询指定字段数据
find()方法中可以指定查询指定字段的数据,将要返回的字段对应值设置为 1
for x in mycol.find({},{ "_id": 0, "name": 1, "age": 1 }):
print(x)
需要注意的是:除了 _id 你不能在一个对象中同时指定 0 和 1,下面的例子会报错
for x in mycol.find({},{'name':0,'age':1}):
print(x)
报错为
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.
查询指定条件数据
可以在 find() 中设置参数来过滤数据
mydata = mycol.find_one({ "name": "valkyrie" })
print(mydata)
或
mydata = mycol.find({ "name": "valkyrie" })
for x in mydata:
print(x)
高级查询
查询的条件语句中,我们还可以使用修饰符。
以下实例用于读取age字段中大于18的数据,大于的修饰符条件为 {"$gt": 18} :
mydata = mycol.find({ "age": { "$gt": 18 } })
for x in mydata:
print(x)
正则表达式查询
我们还可以使用正则表达式作为修饰符(只用于搜索字符串的字段)。
以下实例用于读取name字段中以v字母开头的数据,正则式修饰符条件为 {"$regex": “^v”}:
mydata = mycol.find({ "name": { "$regex": "^v" } })
for x in mydata:
print(x)
查询指定条数数据
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,参数为数字
myresult = mycol.find().limit(2)
for x in myresult:
print(x)
Pymongo排序文档
sort() 方法可以指定升序或降序排序。第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
下例为以age字段对文档进行排序,排序规则为升序。
mydata = mycol.find().sort("age")
下例为以age字段对文档进行排序,排序规则为降序。
mydata = mycol.find().sort("age", -1)