我尝试根据一个查询来实现MongoDB分页,该查询总是应该用名为updateTime
的日期字段来缩短。
我尝试使用运算符ObjectID
和$gt
通过下一个和上一个$lt
实现分页分页,并限制一些结果页面大小。
在adition中,查询可能包含多个过滤器(distinc字段匹配值)。
为了构建一致的分页方法,基于可能包含或不包含过滤器的查询,我尝试确定第一个和最后一个ObjectID,尽管搜索可能生成的页数。
@staticmethod
def paginate_reviews(gt_oid, lt_oid, account, location, rating, responded, start_datetime=None, end_datetime=None):
query = {'location': {'$in': location}}
if account is not None:
query['account'] = account
if start_datetime is not None and end_datetime is not None:
query['updateTime'] = {'$gte': start_datetime, '$lte': end_datetime}
if gt_oid is not None:
query['_id'] = {'$gt': ObjectId(gt_oid)}
elif lt_oid is not None:
query['_id'] = {'$lt': ObjectId(lt_oid)}
if rating is not None and len(rating) is not 0:
rating = [int(r) for r in rating]
query['starRatingNumber'] = {'$in': rating}
if responded is not None:
responded = json.loads(responded)
query['reviewReply'] = {'$exists': responded}
reviews = Review.objects.filter(__raw__=query).order_by('-updateTime', '_id')[:25]
response = {
'reviews': reviews
}
if gt_oid is None and lt_oid is None:
first = Review.objects().filter(__raw__=query).order_by('updateTime').first()
last = Review.objects().filter(__raw__=query).order_by('-updateTime').first()
first_oid = str(first.to_mongo().get('_id')) if first is not None else None
last_oid = str(last.to_mongo().get('_id')) if last is not None else None
response['first_oid'] = first_oid
response['last_oid'] = last_oid
return response
first_oid
应该是第一页的第一个文档,last_oid
应该是最后一页的最后一个元素。
当我在第一页时,我会查询下一个:
db.review.find({"_id" : {$gt: ObjectId("5a776c41c68932281c2240f1")}}).sort({'_id': 1, 'updateTime': -1}).limit(25)
将5a776c41c68932281c2240f1
作为第一页的最后一个元素。
到目前为止,它在尝试向前分页时正常工作。然而,当尝试向后分页时,即使我在第3页,第5页或任何页面中发生了奇怪的事情,使用$lt
传递页面中第一个元素的匹配也会返回第1页的第一个元素。
这打破了我的整个实施。我该如何调整呢?