Code前端首页关于Code前端联系我们

Python如何使用MongoDB数据库?读够了!

terry 2年前 (2023-09-24) 阅读数 54 #后端开发

MongoDB是一个用C++编写的非关系型数据库。它是一个基于分布式文件存储的开源数据库系统。其内容的存储格式与JSON对象类似。它的字段值可以包含其他文档、表格、文档表,非常灵活。本节将介绍 MongoDB 的 Python 3 保存函数。

1。准备工作

开始之前,请确保已经安装了 MongoDB 并启动了其服务,并且安装了 Python PyMongo 库。

2。连接儒家

连接儒家时,我们需要使用PyMongo库中的MongoClient。一般来说,跳过MongoDB的IP地址和端口即可。第一个参数是地址host,第二个参数是端口port(如果不传递参数,默认值为❙1 2701)。这样,就可以创建一个儒家连接对象。

另外参数后缀MongoClienthost也可以直接转入孔夫子。 mongodb来自,例如:

client = MongoClient('mongodb://localhost:27017/')

这样也可以达到同样的连接效果。

3。配置数据库

MongoDB可以创建多个数据库。接下来,我们需要确定使用哪个数据库。这里我们以测试数据库为例。下一步是确定程序中要使用的数据库:

db = client.test

从这里将的test的测试数据库返回给客户。当然,我们也可以这样定义:

db = client['test']

这两种方法是等价的。

4。定义集合

每个MongoDB数据库都包含很多类似于关系数据库中的表的集合(collection)。

要使用的集合在下一步中定义。在这里,将集合名称设置为students。与定义数据库一样,定义集合有两种方法:

collection = db.students
collection = db['students']

这是定义 Collection 对象的方法。

5。添加信息

接下来您可以添加信息。为学生集合创建新的学生记录。此信息以字典格式呈现:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

此处显示学生的学号、姓名、年龄和性别。接下来直接调用lCollection

Insert()INSERT()l方法插入数据。代码如下:
result = collection.insert(student)
print(result)

在MongoDB中,每条信息其实都有一个_id属性来标识它。如果未指定该属性,则MongoDB会自动创建类型为ObjectId_id属性。 insert()方法执行后返回_id值。

运行结果如下:

5932a68615c2606814c91f3d

当然我们也可以同时添加多个数据,你只需以列表形式传入即可。示例如下:

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert([student1, student2])
print(result)

返回结果是一个类似于 _id 的数组 :

[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]

其实在 PyMongo 3.x 版本中sss官方 › 方法是没有的更长推荐。当然,继续使用也没有什么问题。官方推荐使用方法 insert_one()insert_many() 来插入单条记录和多条记录。示例如下:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

result = collection.insert_one(student)
print(result)
print(result.inserted_id)

运行结果如下:

<pymongo.results.InsertOneResult object at 0x10d68b558>
5932ab0f15c2606f0c1cf6c5

insert() 方法不同。这次它返回一个 InsertOneResult 对象。我们可以调用它的 inserted_id 属性来获取 _ id。在

insert_many()方法中,我们可以以列表的形式传递数据。示例如下:

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)

运行结果如下:

<pymongo.results.InsertManyResult object at 0x101dea558>
[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]

该方法返回的类型为 InsertMany Result ,通过调用id 属性可以获取_id

名单插入的数据。 ? find_one()

问题你得到一个结果,find()返回一个生成器对象。示例如下:
result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)

这里我们询问姓名信息Mike。它的返回结果是字典类型的。运行结果如下:

<class 'dict'>
{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

可以注意到,它多了一些 _id

属性,这些属性是 MongoDB 在插入过程中自动添加的。

另外,我们还可以根据ObjectId进行查询。这种情况下,我们需要使用bson库中的对象ID

from bson.objectid import ObjectId

result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
print(result)

查询结果仍然是字典类型,如下:

{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}

当然,如果查询结果不存在。 什么都没有返回

询问多条信息时,我们可以使用find()方法。例如,这里是 20 年前的数据。示例如下:

results = collection.find({'age': 20})
print(results)
for result in results:
    print(result)

运行结果如下:

<pymongo.cursor.Cursor object at 0x1032d5128>
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}

返回结果为与发电机类型对应的指针。 。我们必须通过才能得到所有结果。 ,其中每个结果都是字典类型。

如果要查询20年以上的信息,写法如下:

results = collection.find({'age': {'$gt': 20}})

这里查询的条件键值不再是简单的数字,而是一个字典,其键名为比较符号 $gt,表示大于,键值为20。

比较符号总结如下表。

符号 含义 示例
$lt 小于 {'age':t 大于 {'年龄': {$gt': 20}}
$lte 小于或等于 {'age': {'$lte': 20}}$ gte 大于等于 { '年龄': {'$gte': 20}}
$ne 不等于${'ne': {'21 年龄': {'$nin ': [20, 23] } }

此外,您还可以执行标准搜索查询。例如要查询姓名以M开头的学生数据,示例如下:

results = collection.find({'name': {'$regex': '^M.*'}})

这里使用$regex来判断正则匹配,.*正则以 M 开头的表达式。

以下是下表中分类的一些功能符号。† M.*'} }

名称以M开头$存在该属性是否存在? {'name': {'$exists': true}}name属性存在$type : 'int'}}年龄类型是int$modnumber 模块运算 number 模块运算5.0]'':'{ }}age mod 5 大于 0$text 文本查询{'$text': {'$search': 'Mike'}} ❝ 类型的❙text属性包含Mikestring$where 高级条件查询 = j'ob'$j's.f.'ob'$j's。 _count'}粉丝数等于关注者数

这些操作的更详细用法可以参见MongoDB官方文档:
https://docs.mongodb.com/manual/参考/运算符/查询/。

7。统计

通过调用count()方法可以统计查询结果中有多少条数据。例如统计所有数据元素的个数:

count = collection.find().count()
print(count)

或统计满足某个条件的数据:

count = collection.find({'age': 20}).count()
print(count)

运算的结果是一个数值,即满足条件的数据元素的个数。

8。排序

排序时,直接调用sort()方法,并传入排序字段以及升序和降序标志。示例如下:

results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])

驱动结果如下:

['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']

这里我们按升序调用pymongo.ASCENDING。如果想按降序排序,可以留下pymongo.DESCENDING

9。偏移量

在某些情况下,我们可能只想获取某些元素。这种情况下,我们可以使用 skip() 方法来移动多个位置,比如偏移 2 ,只需忽略前两个元素,得到第三个及后续元素:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])

运算结果如下:

['Kevin', 'Mark', 'Mike']

另外,还可以使用limit()方法来确定要取的结果数量,示例如下:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)
print([result['name'] for result in results])

运行结果如下: 如果不使用​​limit()方法,最初会返回三个结果。添加限制后,捕获并返回两个结果。

值得注意的是,当数据库数量非常大时,比如几千万、几十亿,最好不要使用大偏移量来查询数据,因为这样很可能会导致内存溢出。此时,您可以使用查询对应的功能:

from bson.objectid import ObjectId
collection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})

此时,您需要保存最后查询的_id

10。更新

在更新数据时,我们可以使用update()方法来定义更新条件和要更新的数据。例如:

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)

这里我们要将年龄姓名更新为Kevin年龄和查询:先调用,然后设置 update() 方法传递原始条件和修改信息。

运行结果如下:

返回结果为字典格式,ok表示执行成功,为受影响的数据项个数。

此外,我们还可以使用$set运算符来更新数据。代码如下:

result = collection.update(condition, {'$set': student})

这样就只能更新学生词典中的字段了。如果最初还有其他字段,则不会更新或删除它们。如果不使用​​$set,则之前的所有数据将被学生词典替换;如果其他字段原来存在,则将其删除。

另外,update()方法实际上官方并不推荐。它还分为 update_one()update_many() 方法。使用更加严格。他们的第二个参数必须使用 $类型运算符作为字典的 Key 名称,示例如下: update_one() 方法在这里被调用。第二个参数不能再直接传递给修改后的字典。相反, {'$set' : Student} 在这种形式中,返回结果的类型为 UpdateResult。然后调用matched_countmodified_count获取匹配数据数和受影响数据数。

运行结果如下:

<pymongo.results.UpdateResult object at 0x10d17b678>
1 0

再看一个例子:

condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

这里查询条件是age大于20,那么更新条件是c'{': 'age': 1 }}

,即age加1,执行后第一个满足条件的数据age加1。

运行结果如下:

<pymongo.results.UpdateResult object at 0x10b8874c8>
1 1

可以看到匹配的项数为1,1也受影响。

如果调用

update_many()

方法,所有匹配数据将被更新。示例如下:

condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

当前匹配数不再是1,运行结果如下:

<pymongo.results.UpdateResult object at 0x10c6384c8>
3 3

可以看到当前所有命中信息正在更新。

11。删除

删除相对容易。您可以通过调用 remove() 方法来指定删除条件。此时,所有符合条件的数据都会被删除。示例如下:

result = collection.remove({'name': 'Kevin'})
print(result)

运行结果如下:

{'ok': 1, 'n': 1}

另外,新增了两个推荐方法 - delete_one()

和 。示例如下:
result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

运行结果为:

<pymongo.results.DeleteResult object at 0x10e6ba4c8>
1
4

delete_one(),删除第一个匹配的数据,()删除所有匹配的数据。他们的返回结果都是DeleteResult类型。您可以调用 deleted_count 属性查看已删除数据项的数量。

12。其他操作

此外,PyMongo 还提供了一些复合方法,如 find_one_and_delete()

‶ fin d_one_and_update() ,分别是删除、替换以及搜索后的更新操作,其使用方法与上面的方法基本相同。

此外,您还可以使用目录。相关方法有 create_index()create_indexes() 和 和

等。

的详细用法,参见PyMongo的官方文档:http: // api.mongodb.com/python/current/api/pymongo/collection.html。

另外,数据库和集合本身还有一些功能。这里我就不一一解释了。您可以查看官方文档:http://api.mongodb.com/python/current/api/pymongo/。

本节讲解如何通过PyMongo使用Future来添加、删除、编辑、验证数据。

作者:崔庆才丨景迷

来源:稀土掘金

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门