欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python操作MongoDB数据库

程序员文章站 2022-11-05 13:25:52
上一篇文章中介绍了怎么用python连接MongoDB数据库,现在写一下python控制MongoDB进行增删改查操作。 首先连接数据库: Python MongoDB增加数据 插入一条记录: 输出结果: insert_one() 方法返回 InsertOneResult 对象,可使用下面方法查看对 ......

上一篇文章中介绍了怎么用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 值。

执行完以上查找,我们可以在命令终端,查看数据是否已插入:

python操作MongoDB数据库

插入指定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数据库

 

 python mongodb 删除数据

 删除单个文档:

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

本文使用的测试数据如下:

 python操作MongoDB数据库

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数据库

python mongodb 修改文档

修改一条记录

在 mongodb 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多余一条,则只会修改第一条。

 本文使用的测试数据如下

python操作MongoDB数据库

将 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 语句。

本文使用的测试数据如下

python操作MongoDB数据库

使用 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