背景

MongoDB 是由 C 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组以及文档数组,非常灵活。

连接 MongoDB

Mongo 没有开启认证

连接 MonogoDB 时,我们需要使用 PyMonogo 中的 MongoClient。连接 MongoDB 有两种形式

方式一:传入 host 和 port

  1.  
    import pymongo
  2.  
     
  3.  
    client = pymongo.MongoClient(host='127.0.0.1', port=27017)

方式二:传入 ‘mongodb://{host}:{port}’

  1.  
    import pymongo
  2.  
     
  3.  
    client = pymongo.MongoClient('mongodb://127.0.0.1:27017')

以上两种形式均可创建 MongoDB 的连接对象。

Mongo 开启认证

连接方式

pymongo 版本小于 3.9
  1.  
    import pymongo
  2.  
     
  3.  
    client = pymongo.MongoClient(host='127.0.0.1', port=27017)
  4.  
    # db 表示数据库名称,username 用户名 password 密码
  5.  
    client.db.authenticate(useranme, password)
pymongo 版本大于等于 4.0
  1.  
    from pymongo import MongoClient
  2.  
     
  3.  
    client = MongoClient(host='127.0.0.1', port=27017, username='root', password='admin', authSource='test')

官网版本改动改动说明:https://pymongo.readthedocs.io/en/stable/migrate-to-pymongo4.html#database-authenticate-and-database-logout-are-removed

注意:需要根据项目下载的版本选择不同的认证方式,否则会导致认证失败

指定数据库

MongoDB 中可以建立多个数据库,下面我们可以指定操作某个数据库,下面我们以 test 数据库为例

  1.  
    # 建立数据库连接
  2.  
    db = client.test # or db = client['test']

指定集合

MongoDB 的每个数据库又包含多个集合(collection),可以把他们看作关系型数据库中的表,下面我们指定一个集合,这里我们指定集合为 student,同样指定集合也有两种方式

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

插入数据

插入数据也有多种方式

插入单条数据

  • insert_one:插入单条数据
  1.  
    student = {
  2.  
    'id': 1,
  3.  
    'name': 'test',
  4.  
    }
  5.  
    res = collection.insert_one(student)
  6.  
    print(res, res.inserted_id)

说明:在 MongoDB 中,每条数据其实都有一个 _id 属性来唯一标识。如果没有显式指明该属性,MongoDB 会自动生成一个 ObjectId 类型的 _id 属性。insert_one 中返回的 object 中 inserted_id 可以获取该属性

插入多条数据

  • insert_many:插入多条数据
  1.  
    studends = [
  2.  
    {
  3.  
    'id': 1,
  4.  
    'name': 'test',
  5.  
    },
  6.  
    {
  7.  
    'id': 2,
  8.  
    'name': 'test2',
  9.  
    }
  10.  
    ]
  11.  
    res = collection.insert_many(studends) # >>> [ObjectId('623def841a44a3456deff68d'), ObjectId('623def841a44a3456deff68e')]

更新数据

更新操作和插入操作类似,Pymongo 提供了两种更新方法,即 update_one() 和 update_many() 方法,其中 update_one() 方法只会更新满足条件的第一条记录

  • 如果使用 $set,则只更新 object 对象内已经存在的字段,如果更新前还有其他字段,则不更新也不删除
  • 如果不使用 $set,则会把更新的数据全部用 object 对象替换,如果原本存在其他字段则会被删除
  1.  
    # 更新满足条件{'id', 2}的第一条记录,将 id 更新为 3
  2.  
    res = collection.update_one({'id': 2}, {'$set': {'id': 3, 'age': 10}})
  3.  
     
  4.  
    # 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。
  5.  
    print(res.matched_count, res.modified_count)
  6.  
    #打印结果:1 1
  7.  
     
  8.  
    # 更新满足条件 id>1 的所有记录,id 字段自加 100
  9.  
    res = collection.update_many({'id': {'$gt': 1}}, {'$inc': {'id': 100}})
  10.  
     
  11.  
    # 打印更新匹配和影响的记录数
  12.  
    print(res.matched_count, res.modified_count)
  13.  
    #打印结果:1 1
  14.  
     
  15.  
    stu = {'id': 4, 'name': 'test3'}
  16.  
    #upsert=True表示如果没有满足更新条件的记录,则会将stu插入集合中
  17.  
    res = collection.update_one({'id': 4}, {'$set': stu}, upsert=True)
  18.  
    print(res.matched_count, res.modified_count)
  19.  
    #打印结果:0 0
学新通

查询数据

插入数据后,我们可以利用 find_one() 或者 find() 方法进行查询

  • find_one():查询单个
  1.  
    res = collection.find_one({'id': 2})
  2.  
    print(res) # >>> {'_id': ObjectId('623def841a44a3456deff68e'), 'id': 2, 'name': 'test2'}
  • find():查询多个
  1.  
    res = collection.find({'id': 1})
  2.  
    print(list(res))
  3.  
     
  4.  
    # >>> [{'_id': ObjectId('623dd9c8e9fd60c3b848759d'), 'id': 1.0, 'name': 'test'}, {'_id': ObjectId('623de23f8345ac3b087d264e'), 'id': 1, 'name': 'test'}]

删除数据

删除数据同样有两种方法,delete_one() 和 delete_many()

  • delete_one():删除符合条件的一条记录
  • delete_many():删除符合条件的所有记录
  1.  
    # 删除满足条件的第一条记录
  2.  
    res = collection.delete_one({'id': 1})
  3.  
    # 同样可以通过返回对象的 deleted_count 属性查询删除的记录数
  4.  
    print(result.deleted_count)
  5.  
    # 打印结果:1
  6.  
     
  7.  
    # 删除满足条件的所有记录,以下为删除 page < 90 的记录
  8.  
    result = collection.delete_many({'id': {'$lt': 2}})
  9.  
    print(result.deleted_count)
  10.  
    # 打印结果:2

条件查询

条件比较符如下表:

学新通

如果要查询 id 大于 3 的数据,写法如下

results = collection.find({'id': {'$ge': 3}})

功能符号进行归类如下表

学新通

具体操作可以查看官网提供文档:https://docs.mongodb.com/manual/reference/operator/query/

计数

在某些场景下我们需要统计一共有多少条数据,可以调用 count() 方法。find() 中还可以增加过滤条件

count = collection.find().count()

排序

排序是时直接调用 sort() 方法,并在其中传入排序的字段及升、降序标志即可

  • 升序:pymongo.ASCENDING
  • 降序:pymongo.DESCENDING
  1.  
    # 按照 id 降序
  2.  
    res = collection.find().sort('id', DESCENDING)
  3.  
    print(list(res))

更多操作请查看 Pymongo 文档:https://pymongo.readthedocs.io/en/stable/index.html