MongoDB查询指南:MongoEngine查询操作详解
MongoEngine作为Python中最流行的MongoDB ODM(Object Document Mapper)工具之一,提供了强大而灵活的查询接口。本文将深入解析MongoEngine的查询功能,帮助开发者高效地与MongoDB交互。
基础查询操作
在MongoEngine中,每个Document类都有一个objects
属性,它是访问数据库中与该类关联对象的入口点。这个objects
属性实际上是QuerySetManager
的实例,每次访问时都会创建并返回一个新的QuerySet
对象。
# 打印数据库中所有用户的名字
for user in User.objects:
print(user.name)
从MongoEngine 0.8版本开始,查询集使用了本地缓存机制。这意味着多次迭代同一个查询集只会执行一次数据库查询。如果不希望使用缓存,可以调用no_cache()
方法。
查询过滤
通过向QuerySet
对象传递字段查找关键字参数,可以对查询进行过滤。这些关键字参数对应于你正在查询的Document类中的字段:
# 返回国家字段为'uk'的所有用户
uk_users = User.objects(country='uk')
对于嵌入式文档中的字段,可以使用双下划线语法进行引用:
# 返回作者国家为'uk'的所有页面
uk_pages = Page.objects(author__country='uk')
查询运算符
除了相等比较外,MongoEngine还支持多种查询运算符,这些运算符通过双下划线附加到字段名后使用:
# 查找年龄小于等于18的用户
young_users = Users.objects(age__lte=18)
常用运算符包括:
ne
- 不等于lt
- 小于lte
- 小于等于gt
- 大于gte
- 大于等于in
- 值在列表中nin
- 值不在列表中mod
- 取模运算all
- 列表包含所有指定值size
- 数组大小exists
- 字段存在
字符串查询运算符
MongoEngine为字符串查询提供了便捷的运算符:
exact
- 精确匹配iexact
- 精确匹配(不区分大小写)contains
- 包含icontains
- 包含(不区分大小写)startswith
- 以...开头istartswith
- 以...开头(不区分大小写)endswith
- 以...结尾iendswith
- 以...结尾(不区分大小写)regex
- 正则表达式匹配iregex
- 正则表达式匹配(不区分大小写)
地理空间查询
MongoEngine为地理空间字段(如PointField
, LineStringField
, PolygonField
)提供了专门的查询运算符:
# 查找位于多边形内的点
loc.objects(point__geo_within=[[[40, 5], [40, 6], [41, 6], [40, 5]]])
# 查找距离某点一定范围内的位置
loc.objects(point__near=[40, 5], point__max_distance=1000)
列表查询
对于ListField
字段,查询语法略有不同。可以直接提供单个值来匹配包含该值的列表:
class Page(Document):
tags = ListField(StringField())
# 匹配tags列表包含'coding'的所有页面
Page.objects(tags='coding')
还可以通过位置索引查询列表中的特定元素:
# 匹配第一个tag为'db'的页面
Page.objects(tags__0='db')
原始查询
MongoEngine允许直接使用原始的PyMongo查询语法:
Page.objects(__raw__={'tags': 'coding'})
同样,也可以使用原始更新语法:
Page.objects(tags='coding').update(__raw__={'$set': {'tags': 'coding'}})
结果排序与分页
可以使用order_by()
方法对结果进行排序:
# 按日期升序排序
blogs = BlogPost.objects().order_by('date')
# 先按日期升序,再按标题降序
blogs = BlogPost.objects().order_by('+date', '-title')
对于分页查询,可以使用数组切片语法:
# 前5个用户
users = User.objects[:5]
# 跳过前10个用户,获取接下来的5个
users = User.objects[10:15]
聚合操作
MongoEngine提供了多种聚合方法:
# 计数
num_users = User.objects.count()
# 求和
yearly_expense = Employee.objects.sum('salary')
# 平均值
mean_age = User.objects.average('age')
自定义查询集
可以通过继承QuerySet
类来创建自定义查询方法:
class AwesomerQuerySet(QuerySet):
def get_awesome(self):
return self.filter(awesome=True)
class Page(Document):
meta = {'queryset_class': AwesomerQuerySet}
# 使用自定义查询方法
Page.objects.get_awesome()
默认查询管理
可以通过定义查询管理器方法来修改默认查询行为:
class BlogPost(Document):
title = StringField()
published = BooleanField()
@queryset_manager
def live_posts(doc_cls, queryset):
return queryset.filter(published=True)
MongoEngine的查询功能强大而灵活,本文介绍了其主要特性和使用方法。掌握这些查询技巧,可以让你在MongoDB数据操作中游刃有余。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考