首页 > 解决方案 > 当字段为无(mongoengine)时,为布尔和字符串字段传递什么默认值以成功进行数据库比较

问题描述

我的查询看起来像:

employee = Partner_employees.objects()\
            .filter(id=user_id) \
            .filter(earnings__gte=preconditions.earnings.gte) \
            .filter(earnings__lte=preconditions.earnings.lte) \
            .filter(work_rating__gte=preconditions.credit_score) \
            .filter(employment_status=preconditions.employment_status) 

现在有一些计划在先决条件中具有就业状态,而有些则没有。

例子 :

前提条件下的就业状态

B计划:val(preconditions.employment_status ) = True

就业状态不是先决条件

计划A:val(preconditions.employment_status ) = None

用户信息:

用户A:val(employment_status)= True

用户B: val(employment_status)= False

所以我想要userAuserB在查询结果中PlanA(失败)

userA在查询结果中planB(这有效)

标签: pythonmongodbormmongoengineodm

解决方案


这是 MongoEngine 的一个不幸的方面。通常默认值不会显式写入数据库(或者如果您在某些记录存在后添加了默认值)。我看到几个选项:

  1. 将错误记录显式设置为 False 并保存。然后查询应该工作。这需要对数据库中已有的记录进行。

  2. 查询 False 或 None。您可以or像这样使用该功能。我认为这个答案涵盖了它:MongoDB using an OR clause in mongoengine

以你为例,我认为它是这样的:

employee = Partner_employees.objects()\
            .filter(id=user_id) \
            .filter(earnings__gte=preconditions.earnings.gte) \
            .filter(earnings__lte=preconditions.earnings.lte) \
            .filter(work_rating__gte=preconditions.credit_score) \
            .filter(Q(employment_status=False or Q(employment_status=None)) 

我不确定默认值采用哪种方式,但您始终可以这样做。我假设默认值为 False:

query = ... # same as above but not test for employment_status
if preconditions.employment_stats:
   query = query.filter(employment_status=True)
else:
   query = query.filter(Q(employment_status=False or Q(employment_status=None))

return query.first()

推荐阅读