Как получить нумерацию страниц для агрегата Mon go - PullRequest
1 голос
/ 11 января 2020

Я использовал flask -paginate для нумерации страниц и Mon go DB в качестве базы данных:

На странице view.py

from flask_paginate import Pagination, get_page_args

@app.route('/test',methods=['GET','POST'])
def searchindex():
    page, per_page, offset = get_page_args()
    pipeline = [{
    '$match': {
       "meanings.speech_part":word_type,
       "$expr": { "$gt": [ { "$strLenCP": "$word" }, word_length ] }
    }}]
    cursor_objects = db['test'].aggregate(pipeline)
    cursor_objects_list=list(cursor_objects)
    pagination = Pagination(page=page, total=len(cursor_objects_list),per_page=per_page,offset=offset,record_name='words')
    return render_template('index.html',data=cursor_objects_list,pagination=pagination)

В индексе. html:

{{ pagination.info }}
{{ pagination.links }}

{% for word in data %}
  <tr>
    <td>{{ loop.index + pagination.skip }}</td>
    <td> {{ word['word'] }}</td>
  </tr>
{% endfor %}

, пока я делаю это, все результаты отображаются сразу как:

enter image description here

Даже нажатие на 2 ( страница 2) показывает те же результаты, но диапазон номеров изменяется следующим образом:

enter image description here

Я застрял там, где сделал неправильно, limit Применительно к совокупности это вопрос на моей голове?

Любая помощь приветствуется, TIA

1 Ответ

1 голос
/ 11 января 2020

Рекомендуется применять оператор $sort для правильного разбиения на страницы.

Возможно, вы получаете разные результаты для каждого выполнения.

Попробуйте способ MongoDB. Просто добавьте в качестве последних этапов $skip и $limit в конвейер агрегации (представьте, что у вас> 1M записей) и рассчитайте общий результат отдельно:

#We add $skip and $limit
pipeline = [
  {
    '$match': {
       "meanings.speech_part":word_type,
       "$expr": { "$gt": [ { "$strLenCP": "$word" }, word_length ] }
    }
  },
  {'$sort': {'_id': 1}},
  {'$skip': page * per_page},
  {'$limit': per_page}
]

#We add $count
count_pipeline = [
  {
    '$match': {
       "meanings.speech_part":word_type,
       "$expr": { "$gt": [ { "$strLenCP": "$word" }, word_length ] }
    }
  },
  {'$count': "total"}
]

Теперь мы подсчитываем общее количество записей без $skip и $limit ни $sort.

pagination = Pagination(page=page, total=list(db['test'].aggregate(count_pipeline))[0].total, per_page=per_page, offset=offset, record_name='words')
return render_template('index.html', data=cursor_objects_list, pagination=pagination)
...