美文网首页
135MongoDB 数据库入门实战--Python 使用 Mo

135MongoDB 数据库入门实战--Python 使用 Mo

作者: Jachin111 | 来源:发表于2021-09-07 06:43 被阅读0次

    实验准备
    打开实验环境,在终端输入如下命令启动 MongoDB 服务,进入命令行交互客户端:

    $ cd
    $ sudo service mongodb start
    $ mongo
    

    Python 的 MongoDB 驱动

    Python 使用 MongoDB 需要第三方库 pymongo 提供驱动,我们使用包管理工具 pip3 安装它。
    首先打开一个新的终端标签:


    image.png

    更新 pip3 并安装最新的 pymongo 第三方库:

    $ cd
    $ sudo pip3 install -U pip
    $ sudo pip3 install -U pymongo
    

    操作截图如下:


    image.png

    在前面的实验中,我们使用的是 MongoDB 自己的命令行交互客户端来操作数据库。本节实验我们使用 Python 的命令行解释器 ipython 来操作数据库。
    在终端执行 ipython3 打开命令行交互解释器:


    image.png
    在命令行交互解释器中执行如下代码:
    In [1]: from pymongo import MongoClient
    
    In [2]: client = MongoClient(host='localhost', port=27017)
    
    In [3]:
    

    其中第 1 行代码的作用是从 pymongo 库中引入 MongoClient 类。第 2 行代码是创建类的实例 client ,需要提供 host 和 port 两个参数,它们都是固定值。host 的值也可以写成 '127.0.0.1' ,因为是本地连接数据库;port 是本地 MongoDB 服务运行的端口号,它是固定值。client 这个对象就相当于 MongoDB 的客户端,接下来所有 MongoDB 相关操作都要通过该对象。

    创建数据库和集合

    我们可以使用 client 的 list_database_names 方法查询 MongoDB 中有哪些数据库:

    In [4]: client.list_database_names()
    Out[4]: ['admin', 'config', 'local', 'shiyanlou']
    

    对应到 MongoDB 客户端中的查询结果:

    > show dbs
    admin      0.000GB
    config     0.000GB
    local      0.000GB
    shiyanlou  0.000GB
    >
    

    我们知道 MongoDB 没有创建数据库的操作,那么怎么在 ipython 中实现 MongoDB 客户端中的 use shiyanlou 操作呢?我们使用 client 的 get_database 方法,将数据库的名字以字符串的格式作为参数,该方法的返回值就是数据库对象 db 了。
    我们使用 'learn' 作为数据库的名字:

    In [6]: db = client.get_database('learn')
    

    当然此时并未创建 learn 数据库,需要添加数据或者创建一个文档集合才会创建数据库。
    创建文档集合使用 create_collection 方法,参数为集合的名字:

    In [12]: course = db.create_collection('course')
    
    In [13]: course
    Out[13]: Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'learn'), 'course')
    
    In [15]: db.list_collection_names()
    Out[15]: ['course']
    

    如上所示,db.create_collection 方法的返回值即为集合对象,将其赋值给变量 course 。我们可以使用 list_collection_names 方法查看当前数据库 learn 中的集合列表。
    同时 db 也就有了 course 这个属性,属性值就是集合对象:

    In [16]: db.course
    Out[16]: Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'learn'), 'course')
    

    此外,我们还可以像字典对象获取 key 对应的 value 一样获取集合对象:

    In [17]: db['course']
    Out[17]: Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'learn'), 'course')
    

    此时 MongoDB 客户端中可以看到上述操作的结果:

    > show dbs
    admin      0.000GB
    config     0.000GB
    learn      0.000GB
    local      0.000GB
    shiyanlou  0.000GB
    > use learn
    switched to db learn
    > show collections
    course
    >
    

    插入数据

    在 MongoDB 客户端中使用 insert 、insertOne 、insertMany 等函数插入数据,这些函数由集合调用。同样在 Python 中也有这些方法,方法名也类似。Python 中变量的命名规则通常采用下划线法,insertOne 对应为 insert_one ,insertMany 对应 insert_many 。目前的 pymongo 推荐使用这两个方法来添加数据。
    我们来尝试使用它们:

    In [18]: course.insert_one(
        ...:     {'name': 'Linux 入门基础', 'author': 'James', 'students_number': 1234}
        ...: )
    Out[18]: <pymongo.results.InsertOneResult at 0x7ff485e971c8>
    
    In [19]: course.insert_many([
        ...:     {'name': 'Python 简明教程', 'author': 'Wade', 'students_number': 2234},
        ...:     {'name': 'Git 与 GitHub 入门实践', 'author': 'Wade', 'students_number': 8777}
        ...: ])
    Out[19]: <pymongo.results.InsertManyResult at 0x7ff49f223e48>
    

    这样就创建了三条文档在 course 集合中。可以看出这两个方法的返回值就是文档本身,我们可以将其赋值给某个变量。当然啦,也可以使用 course 的 find 方法来查询集合中的文档,需要注意的是该方法的返回值不是文档的列表,而是一个光标对象,它是一个迭代器:

    In [20]: c = course.find()
    
    In [21]: from collections import Iterator
    
    In [22]: isinstance(c, Iterator)
    Out[22]: True
    

    我们知道 Python 中的迭代器对象相比列表对象的优势就是几乎不占用内存,而是存储算法。如果数据量极大,使用迭代器的优势就很明显。
    我们可以使用 list 方法获取文档对象,或者使用 for 循环获取文档:

    In [23]: results = list(c)
    In [24]: results
    Out[24]:
    [{'_id': ObjectId('5e4cbad16ee351d4d8bd62b9'),
      'author': 'James',
      'name': 'Linux 入门基础',
      'students_number': 1234},
     {'_id': ObjectId('5e4cbb676ee351d4d8bd62ba'),
      'author': 'Wade',
      'name': 'Python 简明教程',
      'students_number': 2234},
     {'_id': ObjectId('5e4cbb676ee351d4d8bd62bb'),
      'author': 'Wade',
      'name': 'Git 与 GitHub 入门实践',
      'students_number': 8777}]
    
    In [25]: for result in course.find():
        ...:     print(result)
        ...:
    {'name': 'Linux 入门基础', 'students_number': 1234, '_id': ObjectId('5e4cbad16ee351d4d8bd62b9'), 'author': 'James'}
    {'name': 'Python 简明教程', 'students_number': 2234, '_id': ObjectId('5e4cbb676ee351d4d8bd62ba'), 'author': 'Wade'}
    {'name': 'Git 与 GitHub 入门实践', 'students_number': 8777, '_id': ObjectId('5e4cbb676ee351d4d8bd62bb'), 'author': 'Wade'}
    

    到这里,我们来看一下 MongoDB 客户端中的情况:

    > use learn
    switched to db learn
    > db.course.find().pretty()
    {
            "_id" : ObjectId("5e4cbad16ee351d4d8bd62b9"),
            "name" : "Linux 入门基础",
            "students_number" : 1234,
            "author" : "James"
    }
    {
            "_id" : ObjectId("5e4cbb676ee351d4d8bd62ba"),
            "name" : "Python 简明教程",
            "students_number" : 2234,
            "author" : "Wade"
    }
    {
            "_id" : ObjectId("5e4cbb676ee351d4d8bd62bb"),
            "name" : "Git 与 GitHub 入门实践",
            "students_number" : 8777,
            "author" : "Wade"
    }
    >
    

    与预期相符,我们使用 Python 代码成功添加了文档数据。

    删除集合和数据库

    删除集合的方法很简单,与 MongoDB 客户端的操作方法一致,使用 drop 方法:

    In [25]: db.list_collection_names()
    Out[25]: ['course']
    
    In [26]: course.drop()
    
    In [27]: db.list_collection_names()
    Out[27]: []
    

    或者使用 db 对象的 drop_collection 方法,将集合名字作为参数。操作如下:

    # 先创建一些测试集合备用
    In [28]: for i in 'abc':
        ...:     db.create_collection(i)
        ...:
    
    In [29]: db.list_collection_names()
    Out[29]: ['c', 'a', 'b']
    
    In [30]: db.drop_collection('c')
    Out[30]: {'nIndexesWas': 1, 'ns': 'learn.c', 'ok': 1.0}
    
    In [31]: db.list_collection_names()
    Out[31]: ['a', 'b']
    

    删除数据库需要用到客户端对象 client 了,使用它的 drop_database 方法,将被删除的数据库名字作为参数:

    In [32]: client.list_database_names()
    Out[32]: ['admin', 'config', 'learn', 'local', 'shiyanlou']
    
    In [33]: client.drop_database('learn')
    
    In [34]: client.list_database_names()
    Out[34]: ['admin', 'config', 'local', 'shiyanlou']
    

    此时 MongoDB 客户端的情况如下:

    > show dbs
    admin      0.000GB
    config     0.000GB
    local      0.000GB
    shiyanlou  0.000GB
    >
    

    可以看到本节实验中创建的 learn 数据库不在了,一切回到了最初的状态。

    相关文章

      网友评论

          本文标题:135MongoDB 数据库入门实战--Python 使用 Mo

          本文链接:https://www.haomeiwen.com/subject/fjfewltx.html