MongoDB分页

时间:2018-02-26 22:06:54

标签: mongodb mongoengine flask-mongoengine

我尝试根据一个查询来实现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页的第一个元素。

这打破了我的整个实施。我该如何调整呢?

0 个答案:

没有答案