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

原文地址:https://www.cnblogs.com/nmsghgnv/p/11289316.html