带日期范围的 Mongoengine 查询
Mongoengine query with date range
我正在尝试在指定时间范围内通过 mongoengine 从 mongodb 检索数据。下面是使用的数据库模型。
class DeviationReport(db.Document):
meta = {'collection': 'DeviationReport'}
created_at = db.DateTimeField()
date = db.DateTimeField()
author = db.StringField()
read_by = db.ListField(default=[])
prod_line = db.ReferenceField(ProductionLine)
product = db.ReferenceField(Product)
description = db.StringField()
我试过的是下面的代码。然而,它没有 return 任何结果。当我需要根据用户输入构建动态查询时,我使用了类似的方法。
kwargs = {}
start = datetime.datetime(2018, 12, 11)
end = datetime.datetime(2019, 03, 13)
kwargs['created_at'] = { '$lt': end, '$gt': start }
DeviationReport.objects(**kwargs)
我显然已经确保在日期范围内有对象,并且我已经阅读了其他类似的帖子,其中成功使用了下面的查询。如何查询 return 'start' 和 'end' 之间的所有内容,或者如何重写它以按我的意愿执行?
谢谢。
我解决了 around/solved 这个问题,方法是首先使用 **kwargs 获取没有日期过滤的结果,然后使用 Q 过滤它。它可能不是最佳的,但它适用于我需要它做的事情。
reports = DeviationReport.objects(**kwargs)
reports = reports.filter((Q(date__gte=start) & Q(date__lte=end)))
有多种方法可以实现您的查询,使用以下示例相应地调整集合和参数:
date_to = datetime.datetime.utcnow() # The end date
date_from = date_to - datetime.timedelta(days=120) # The start date
query_a = Application.objects(category="rest_api").filter(
date_created__gte=date_from,
date_created__lte=date_to
)
query_b = Application.objects(
date_created__gte=date_from,
date_created__lte=date_to
).filter(category="rest_api")
query = {"category": "rest_api"}
query_c = Application.objects(
date_created__gte=date_from,
date_created__lte=date_to,
**query
)
按照上面的建议用 Q 查询对我不起作用,但是 raw query 可以:
raw_query = {'date': {'$gte': start, '$lt': end}}
reports = DeviationReport.objects(__raw__=raw_query)
我正在尝试在指定时间范围内通过 mongoengine 从 mongodb 检索数据。下面是使用的数据库模型。
class DeviationReport(db.Document):
meta = {'collection': 'DeviationReport'}
created_at = db.DateTimeField()
date = db.DateTimeField()
author = db.StringField()
read_by = db.ListField(default=[])
prod_line = db.ReferenceField(ProductionLine)
product = db.ReferenceField(Product)
description = db.StringField()
我试过的是下面的代码。然而,它没有 return 任何结果。当我需要根据用户输入构建动态查询时,我使用了类似的方法。
kwargs = {}
start = datetime.datetime(2018, 12, 11)
end = datetime.datetime(2019, 03, 13)
kwargs['created_at'] = { '$lt': end, '$gt': start }
DeviationReport.objects(**kwargs)
我显然已经确保在日期范围内有对象,并且我已经阅读了其他类似的帖子,其中成功使用了下面的查询。如何查询 return 'start' 和 'end' 之间的所有内容,或者如何重写它以按我的意愿执行?
谢谢。
我解决了 around/solved 这个问题,方法是首先使用 **kwargs 获取没有日期过滤的结果,然后使用 Q 过滤它。它可能不是最佳的,但它适用于我需要它做的事情。
reports = DeviationReport.objects(**kwargs)
reports = reports.filter((Q(date__gte=start) & Q(date__lte=end)))
有多种方法可以实现您的查询,使用以下示例相应地调整集合和参数:
date_to = datetime.datetime.utcnow() # The end date
date_from = date_to - datetime.timedelta(days=120) # The start date
query_a = Application.objects(category="rest_api").filter(
date_created__gte=date_from,
date_created__lte=date_to
)
query_b = Application.objects(
date_created__gte=date_from,
date_created__lte=date_to
).filter(category="rest_api")
query = {"category": "rest_api"}
query_c = Application.objects(
date_created__gte=date_from,
date_created__lte=date_to,
**query
)
按照上面的建议用 Q 查询对我不起作用,但是 raw query 可以:
raw_query = {'date': {'$gte': start, '$lt': end}}
reports = DeviationReport.objects(__raw__=raw_query)