Pymongo 使用

Pymongo

说明:以下操作 pymongo: 4.0.4 mongo: 4.4.4

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

连接 MongoDB

没有开启认证 mongo

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

  1. 方式一:传入 host 和 port

    import pymongo
    
    client = pymongo.MongoClient(host='127.0.0.1', port=27017)
    
  2. 方式二:传入 ‘mongodb://{host}:{port}’

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

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

开启认证的 mongo

连接方式:

  1. pymongo 版本小于 3.9
import pymongo

client = pymongo.MongoClient(host='127.0.0.1', port=27017)
# db 表示数据库名称,username 用户名 password 密码
client.db.authenticate(useranme, password)
  1. pymongo 版本大于等于 4.0 的
from pymongo import MongoClient

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 数据库为例

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

指定集合

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

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

插入数据

下面我们可以插入数据啦,插入数据也有多种方式,下面👇我们逐一介绍

插入单条数据

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

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

插入多条数据

  • insert_many:插入多条数据
studends = [
    {
        'id': 1,
        'name': 'test',
    },
    {
        'id': 2,
        'name': 'test2',
    }
]
res = collection.insert_many(studends) # >>> [ObjectId('623def841a44a3456deff68d'), ObjectId('623def841a44a3456deff68e')]

更新

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

  • 如果使用 $set,则只更新 object 对象内已经存在的字段,如果更新前还有其他字段,则不更新也不删除
  • 如果不使用 $set,则会把更新的数据全部用 object 对象替换,如果原本存在其他字段则会被删除
# 更新满足条件{'id', 2}的第一条记录,将 id 更新为 3
res = collection.update_one({'id': 2}, {'$set': {'id': 3, 'age': 10}})

# 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。
print(res.matched_count, res.modified_count)
#打印结果:1 1

# 更新满足条件 id>1 的所有记录,id 字段自加 100
res = collection.update_many({'id': {'$gt': 1}}, {'$inc': {'id': 100}})

# 打印更新匹配和影响的记录数
print(res.matched_count, res.modified_count)
#打印结果:1 1

stu = {'id': 4, 'name': 'test3'}
#upsert=True表示如果没有满足更新条件的记录,则会将stu插入集合中
res = collection.update_one({'id': 4}, {'$set': stu}, upsert=True)
print(res.matched_count, res.modified_count)
#打印结果:0 0

查询

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

  • find_one():查询单个

    res = collection.find_one({'id': 2})
    print(res) # >>> {'_id': ObjectId('623def841a44a3456deff68e'), 'id': 2, 'name': 'test2'}
    
  • find():查询多个

    res = collection.find({'id': 1})
    print(list(res))
    
    # >>> [{'_id': ObjectId('623dd9c8e9fd60c3b848759d'), 'id': 1.0, 'name': 'test'}, {'_id': ObjectId('623de23f8345ac3b087d264e'), 'id': 1, 'name': 'test'}]
    

删除

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

  • delete_one():删除符合条件的一条记录
  • delete_many():删除符合条件的所有记录
# 删除满足条件的第一条记录
res = collection.delete_one({'id': 1})
# 同样可以通过返回对象的 deleted_count 属性查询删除的记录数
print(result.deleted_count)
# 打印结果:1

# 删除满足条件的所有记录,以下为删除 page < 90 的记录
result = collection.delete_many({'id': {'$lt': 2}})
print(result.deleted_count)
# 打印结果:2

条件查询

  1. 条件比较符如下表:
    img1

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

results = collection.find({'id': {'$ge': 3}})
  1. 这里还有一些功能符号进行归类
    img2

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

计数

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

count = collection.find().count()

排序

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

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

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

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值