PyMongo 查询数据

1,529 阅读2分钟

这是我参与更文挑战的第28天,活动详情查看:更文挑战

如果❤️我的文章有帮助,欢迎评论、关注、点赞。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客

查询数据

往 mongodb存储的所有数据,都是为了需要读取的时候能够取出。

但读取除了按某一列比如分数: 排序 读取;还会出现我只看某一段时间、某个班的条件筛选;还会出现我想看每个班平均分 聚合平均....等等多样操作

这些操作都可以通过 find_one()find() 完成:

ret2find = collect.find_one()
# {'_id': ObjectId('5ea780bf747e3e128470e485'), 'class_name': '高三(1)班', 'student_name': '张三', 'subject': '英语', 'score': 100, 'date': '20200301'}

ret2find = collect.find()
# <pymongo.cursor.Cursor object at 0x0000024BBEBE15C8>

从上面的结果可以看出,find_one() 查询得出单一字典;find()则是一个生成器对象能够通过 for val in ret2find: 遍历取出

设置查询条件

但能取出全部数据还不够,查询一般是会带条件、甚至复杂的条件 —— 比如:查询出 高三(1)班,张三 或 李四,成绩大于90 的科目,该怎么做呢?

ret2find = collect.find({"class_name":"高三(1)班","score":{"$gt":90},"$or":[{"student_name":"张三"},{"student_name":"李四"}]})

for val in ret2find:
    print(val)

上面有两个要点:

{"class_name":"高三(1)班","score":{"$gt":90}}

这一段 写法 表示 “高三(1)班 分数 > 90”;

$gt 比较操作符,表 大于意思,除 $gt 操作符以外还有:

符号含义
$lt小于
$lte小于等于
$gt大于
$gte大于等于
$ne不等于
$in在范围内
$nin不在范围内

{"$or":[{"student_name":"张三"},{"student_name":"李四"}]} 这一段 写法 表示 “学生名称为 张三 李四”

而其中的 $or 逻辑操作符,用它来表示条件之间的关系。除了 $or 以外的逻辑操作符还有:

符号含义
$and按条件取 交集
$not单个条件的 相反集合
$nor多个条件的 相反集合
$or多个条件的 并集

更多查询操作

除了上述常规操作外,具体使用场景中我们还会用到:

符号含义示例示例含义
$regex正则匹配{"student_name":{"regex":".regex":".*三"}}学生名以 “三” 结尾
$expr允许查询中使用 聚合表达式{"expr":{"gt":["spent","spent","budget"]}}查询 花费 大于 预算 的超支记录
$exists属性是否存在{"date":{"$exists": True}}date属性存在
$exists属性是否存在{"date":{"$exists": True}}date属性存在
$type类型判断{"score":{"$type":"int"}}score的类型为int
$mod取模操作{'score': {'$mod': [5, 0]}}分数取5、0的模

更多 查询操作符 可以点击 查看官方文档