Python如何使用MongoDB数据库?读够了!
MongoDB是一个用C++编写的非关系型数据库。它是一个基于分布式文件存储的开源数据库系统。其内容的存储格式与JSON对象类似。它的字段值可以包含其他文档、表格、文档表,非常灵活。本节将介绍 MongoDB 的 Python 3 保存函数。
1。准备工作
开始之前,请确保已经安装了 MongoDB 并启动了其服务,并且安装了 Python PyMongo 库。
2。连接儒家
连接儒家时,我们需要使用PyMongo库中的MongoClient
。一般来说,跳过MongoDB的IP地址和端口即可。第一个参数是地址host
,第二个参数是端口port
(如果不传递参数,默认值为❙1 2701)。这样,就可以创建一个儒家连接对象。
另外参数后缀MongoClient
host
也可以直接转入孔夫子。 mongodb来自,例如:
client = MongoClient('mongodb://localhost:27017/')
这样也可以达到同样的连接效果。
3。配置数据库
MongoDB可以创建多个数据库。接下来,我们需要确定使用哪个数据库。这里我们以测试数据库为例。下一步是确定程序中要使用的数据库:
db = client.test
从这里将的 这两种方法是等价的。 每个MongoDB数据库都包含很多类似于关系数据库中的表的集合(collection)。 要使用的集合在下一步中定义。在这里,将集合名称设置为students。与定义数据库一样,定义集合有两种方法: 这是定义 接下来您可以添加信息。为学生集合创建新的学生记录。此信息以字典格式呈现: 此处显示学生的学号、姓名、年龄和性别。接下来直接调用lCollection 在MongoDB中,每条信息其实都有一个 运行结果如下: 当然我们也可以同时添加多个数据,你只需以列表形式传入即可。示例如下: 返回结果是一个类似于 其实在 PyMongo 3.x 版本中sss官方 › 方法是没有的更长推荐。当然,继续使用也没有什么问题。官方推荐使用方法 运行结果如下: 和 运行结果如下: 该方法返回的类型为 这里我们询问 可以注意到,它多了一些 _id 另外,我们还可以根据 查询结果仍然是字典类型,如下: 当然,如果查询结果不存在。 什么都没有返回test的测试数据库返回给
的客户
。当然,我们也可以这样定义: db = client['test']
4。定义集合
collection = db.students
collection = db['students']
Collection
对象的方法。 5。添加信息
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
Insert()
。
属性,这些属性是 MongoDB 在插入过程中自动添加的。INSERT()l方法插入数据。代码如下:
问题你得到一个结果,result = collection.insert(student)
print(result)
_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')]
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() 方法不同。这次它返回一个
名单插入的数据。 ? find_one()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 属性可以获取_idfind()
返回一个生成器对象。示例如下: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'}
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
$mod
5.0]'':'{ }}
$text
{'$text': {'$search': 'Mike'}} ❝ 类型的❙text属性包含Mike
string
$where
这些操作的更详细用法可以参见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)
这里我们要将年龄 运行结果如下: 此外,我们还可以使用 这样就只能更新 另外, 运行结果如下: 再看一个例子: 这里查询条件是age大于20,那么更新条件是c'{': 'age': 1 }} 运行结果如下: 可以看到匹配的项数为1,1也受影响。 如果调用 当前匹配数不再是1,运行结果如下: 可以看到当前所有命中信息正在更新。 删除相对容易。您可以通过调用 运行结果如下: 另外,新增了两个推荐方法 - 运行结果为: 此外,PyMongo 还提供了一些复合方法,如 此外,您还可以使用目录。相关方法有 的详细用法,参见PyMongo的官方文档:http: // api.mongodb.com/python/current/api/pymongo/collection.html。 另外,数据库和集合本身还有一些功能。这里我就不一一解释了。您可以查看官方文档:http://api.mongodb.com/python/current/api/pymongo/。 本节讲解如何通过PyMongo使用Future来添加、删除、编辑、验证数据。 作者:崔庆才丨景迷 来源:稀土掘金姓名
更新为Kevin年龄和查询:先调用,然后设置
update()
方法传递原始条件和修改信息。 返回结果为字典格式,
ok
表示执行成功,为受影响的数据项个数。 $set
运算符来更新数据。代码如下: result = collection.update(condition, {'$set': student})
学生词典中的字段了。如果最初还有其他字段,则不会更新或删除它们。如果不使用$set
,则之前的所有数据将被学生词典替换;如果其他字段原来存在,则将其删除。
方法,所有匹配数据将被更新。示例如下: update()
方法实际上官方并不推荐。它还分为 update_one()
和 update_many()
方法。使用更加严格。他们的第二个参数必须使用 $
类型运算符作为字典的 Key 名称,示例如下: update_one() 方法在这里被调用。第二个参数不能再直接传递给修改后的字典。相反,
,即age加1,执行后第一个满足条件的数据age加1。 {'$set' : Student}
在这种形式中,返回结果的类型为 UpdateResult
。然后调用matched_count
和modified_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)
<pymongo.results.UpdateResult object at 0x10b8874c8>
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)
<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。其他操作
find_one_and_delete()
、 和
‶ fin d_one_and_update()
,分别是删除、替换以及搜索后的更新操作,其使用方法与上面的方法基本相同。 create_index()
、create_indexes()
和 和 等。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。