这是我参与更文挑战的第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":{""}} | 学生名以 “三” 结尾 |
$expr | 允许查询中使用 聚合表达式 | {"expr":{"gt":["budget"]}} | 查询 花费 大于 预算 的超支记录 |
$exists | 属性是否存在 | {"date":{"$exists": True}} | date属性存在 |
$exists | 属性是否存在 | {"date":{"$exists": True}} | date属性存在 |
$type | 类型判断 | {"score":{"$type":"int"}} | score的类型为int |
$mod | 取模操作 | {'score': {'$mod': [5, 0]}} | 分数取5、0的模 |
更多 查询操作符
可以点击 查看官方文档