python操作MongoDB数据库
上一篇文章中介绍了怎么用python连接mongodb数据库,现在写一下python控制mongodb进行增删改查操作。
首先连接数据库:
import pymongo # 连接数据库 myclient = pymongo.mongoclient("mongodb://localhost:27017/") mydb = myclient["mydb"] mycol = mydb["col"]
python mongodb增加数据
插入一条记录:
x=mycol.insert_one({"name":"刘飞","age":19}) print(x)
输出结果:
<pymongo.results.insertoneresult object at 0x02a45620>
insert_one() 方法返回 insertoneresult 对象,可使用下面方法查看对象所有的属性:
x=mycol.insert_one({"name":"刘飞","age":19}) print(dir(x))
#输出结果 ['_insertoneresult__acknowledged', '_insertoneresult__inserted_id', '_writeresult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'inserted_id']
该对象包含 inserted_id 属性,它是插入文档的 id 值。如果我们在插入文档时没有指定 _id,mongodb 会为每个文档添加一个唯一的 id。
x=mycol.insert_one({"name":"刘飞","age":19}) print(x.inserted_id)
#输出结果 5d43d8189f5e382760e25acf
插入多个文档:
集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。
mylist = [ { "name": "taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "qq", "alexa": "101", "url": "https://www.qq.com" }, { "name": "facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "github", "alexa": "109", "url": "https://www.github.com" } ] x = mycol.insert_many(mylist) # 输出插入的所有文档对应的 _id 值 print(x.inserted_ids) #输出结果 [objectid('5d43d9069f5e38272c69fc07'), objectid('5d43d9069f5e38272c69fc08'), objectid('5d43d9069f5e38272c69fc09'), objectid('5d43d9069f5e38272c69fc0a'), objectid('5d43d9069f5e38272c69fc0b')]
insert_many() 方法返回 insertmanyresult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
执行完以上查找,我们可以在命令终端,查看数据是否已插入:
插入指定id的多个文档:
#先删除之前插入的所有文档 x=mycol.delete_many({}) print(x.deleted_count, "个文档已删除")
#输出结果 11 个文档已删除
mylist = [ {"_id": 1, "name": "runoob", "cn_name": "菜鸟教程"}, {"_id": 2, "name": "google", "address": "google 搜索"}, {"_id": 3, "name": "facebook", "address": "脸书"}, {"_id": 4, "name": "taobao", "address": "淘宝"}, {"_id": 5, "name": "zhihu", "address": "知乎"} ] x = mycol.insert_many(mylist) # 输出插入的所有文档对应的 _id 值 print(x.inserted_ids) #输出结果 [1, 2, 3, 4, 5]
执行完以上查找,我们可以在命令终端,查看数据是否已插入:
python mongodb 删除数据
删除单个文档:
我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
本文使用的测试数据如下:
x=mycol.delete_one({"name":"google"}) print(x.deleted_count,'个文档已删除') #输出结果 1 个文档已删除
删除多个文档:
我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除所有 name 字段中以 f 开头的文档:
myquery = {"name": {"$regex": "^f"}} x = mycol.delete_many(myquery) print(x.deleted_count, "个文档已删除") #输出结果 2 个文档已删除
删除集合中所有的文档:
x = mycol.delete_many({}) print(x.deleted_count, "个文档已删除") #输出结果 7 个文档已删除
删除集合:
mycol.drop()
如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。
我们使用以下命令在终端查看集合是否已删除:
python mongodb 修改文档
修改一条记录
在 mongodb 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多余一条,则只会修改第一条。
本文使用的测试数据如下
将 alexa 字段的值 10000 改为 12345:
mycol.update_one({"alexa":'100'},{'$set':{"alexa":"123456"}}) for i in mycol.find(): print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'alexa': '10', 'url': 'https://www.facebook.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd1'), 'name': 'github', 'alexa': '109', 'url': 'https://www.github.com'}
修改多条记录
使用 update_many()。查找所有以 f 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123:
x=mycol.update_many({"name":{"$regex":"^f"}},{"$set":{"alexa":"123"}}) print(x.modified_count,'个文档已修改') #输出结果 1 个文档已修改
python mongodb 查询文档
mongodb 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 sql 中的 select 语句。
本文使用的测试数据如下
使用 find_one() 方法来查询集合中的一条数据。
x = mycol.find_one() print(x) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
find() 方法可以查询集合中的所有数据,类似 sql 中的 select * 操作。
for i in mycol.find(): print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd1'), 'name': 'github', 'alexa': '109', 'url': 'https://www.github.com'}
查询指定字段的数据
我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
for i in mycol.find({},{"_id":0,"name":1,"url":1}): print(i) #输出结果 {'name': 'taobao', 'url': 'https://www.taobao.com'} {'name': 'qq', 'url': 'https://www.qq.com'} {'name': 'facebook', 'url': 'https://www.facebook.com'} {'name': '知乎', 'url': 'https://www.zhihu.com'} {'name': 'github', 'url': 'https://www.github.com'}
除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
以下实例除了 alexa 字段外,其他都返回:
for i in mycol.find({},{"alexa":0}): print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'url': 'https://www.facebook.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'url': 'https://www.zhihu.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd1'), 'name': 'github', 'url': 'https://www.github.com'}
以下代码同时指定了 0 和 1 则会报错:
for i in mycol.find({},{"alexa":0,"name":1}): print(i) #报错信息 pymongo.errors.operationfailure: projection cannot have a mix of inclusion and exclusion.
根据指定条件查询
在 find() 中设置参数来过滤数据。查找 name 字段为 "qq" 的数据:
mydoc = mycol.find({"name":"qq"}) for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'}
高级查询
查询的条件语句中,我们还可以使用修饰符。
读取 name 字段中第一个字母 ascii 值大于 "h" 的数据,大于的修饰符条件为 {"$gt": "h"} :
mydoc = mycol.find({"name":{"$gt":"h"}}) for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
使用正则表达式查询
正则表达式修饰符只用于搜索字符串的字段。
读取 name 字段中第一个字母为 "t" 的数据,正则表达式修饰符条件为 {"$regex": "^t"} :
mydoc = mycol.find({"name":{"$regex":"^t"}}) for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
返回指定条数记录
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
mydoc = mycol.find().limit(3) for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
对字段 alexa 按升序排序:
mydoc = mycol.find().sort('alexa') for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd1'), 'name': 'github', 'alexa': '109', 'url': 'https://www.github.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
对字段 alexa 按降序排序:
mydoc = mycol.find().sort('alexa',-1) for i in mydoc: print(i) #输出结果 {'_id': objectid('5d43e5ff9f5e381df4a69bcd'), 'name': 'taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bcf'), 'name': 'facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd1'), 'name': 'github', 'alexa': '109', 'url': 'https://www.github.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': objectid('5d43e5ff9f5e381df4a69bce'), 'name': 'qq', 'alexa': '101', 'url': 'https://www.qq.com'}
done
参考资料:https://www.runoob.com/python3/python-mongodb.html
上一篇: Linux-Nginx动态添加模块
下一篇: Python—推导式
推荐阅读
-
Android通过Webservice操作sqlserver数据库实例代码
-
.NET连接MongoDB数据库实例教程
-
Python访问MongoDB环境安装和测试
-
mongodb 数据库连接
-
Oracle常用数据库操作SQL OracleSQL
-
PHP操作MongoDB_PHP教程
-
Laravel框架数据库CURD操作、连贯操作总结,laravelcurd
-
CI框架中数据库操作函数$this->db->where()相关用法总结,this-db-
-
Joomla数据库操作之JFactory::getDBO用法,joomlagetdbo_PHP教程
-
浅谈 Java 中 MongoDB NoSQL数据库使用指南 博客分类: 技术总结NOSql JavaMongoDBNoSQL数据库使用指南