这是我参与更文挑战的第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的模 |
更多 查询操作符 可以点击 查看官方文档