MongoEngine如何在仅知道字段值的情况下查询匹配的文档?
mongoengine 本身不支持通配符匹配任意字段名的查询语法,你无法使用示例中直接传通配符字段的写法,可通过以下两种方案实现需求:
方法1:使用$or条件查询指定的可能字段
这是性能最高、结果最可控的方案,你可以把所有可能的姓名字段都放到or查询条件里,只要任意一个字段的值为"Tim"就会被匹配到,flask-mongoengine写法如下:
from mongoengine.queryset.visitor import Q users = User.objects(Q(name="Tim") | Q(username="Tim") | Q(user_name="Tim"))
如果需要去重(避免同一个用户多个字段都匹配到导致重复返回),可以先拿符合条件的用户id再查询完整数据:
user_ids = User.objects(Q(name="Tim") | Q(username="Tim") | Q(user_name="Tim")).distinct('_id') users = User.objects(id__in=user_ids)
方法2:动态遍历所有文档字段匹配(不推荐,性能差)
如果你完全不确定所有可能的字段名,可以先获取Users集合的所有字段名,再动态拼接查询条件,仅作为应急方案使用:
# 先获取集合所有字段名 field_names = [field for field in User._fields.keys()] # 动态构建Q查询条件 query = Q() for field in field_names: query |= Q(**{field: "Tim"}) # 执行查询 users = User.objects(query)
注意:该方法会匹配所有类型为字符串且值为Tim的字段,可能会返回不符合预期的结果,比如邮箱、地址字段刚好为Tim的用户也会被筛选出来,大数据量下查询性能极低,建议优先使用方法1。
内容的提问来源于stack exchange,提问作者absent 63
相关产品推荐
相关产品推荐

