PyMongonnator 
Just a simple production-ready mongo paginator written in Python for PyMongo package using bucket pattern. This package is based in this wonderful Javascript module: mongo-cursor-pagination.
The reason for making this library was to paginate over thousands of data stored in mongo collections and we didn't find any library that seamlessly integrated with Pymongo.
Installation
pip install PyMongonnator
Python version compat
PyMongonnator is compatible with the latest Python3 versions: 3, 3.5, 3.6, 3.7, 3.8.
Usage
PyMongonnator exposes two ways to paginate over collections:
- Built-in API importing overriden MongoClient class.
- Explicit API passing a MongoClient collection into Paginator method.
Options
query: a SON object specifying elements which must be present for a document to be included in the result set. Default is{}(query all).limit: Number of documents per page. Default is75.ordering_case: Ordering sense when retrieving documents from mongo. Valid options are:ASCENDING: Ascending sort order.DESCENDING: Descending sort order (default).
ordering_field: Field to order collections. Default is_id.projection: a dict specifying the fields to include or exclude. Please note that the id cannot be excluded because is mandatory in pagination. Default is{}(include only the_id).prev_page: Previous pagination pointer. When no previous page is available, will be None. Default isNone.next_page: Next pagination pointer. When no next page is available, will be None. Default isNone.automatic_pagination: If you want to paginate automatically in batches oflimitover entire collection. Default isTrue.
When options are set, they should remain unchanged during the whole pagination process except pagination pointers (prev_page/next_page).
Built-in API (recommended)
from mongonator import MongoClientWithPagination, ASCENDING
MONGO_URI = 'mongodb://[user]:[password]@[host]:[port]/admin'
DATABASE = 'database'
COLLECTION = 'collection'
# Instantiate mongo client with pagination
mongo_client = MongoClientWithPagination(MONGO_URI)
db = mongo_client[DATABASE]
col = db[COLLECTION]
query_filter = {'name': {'$ne': None}}
# Paginate automatically in batches of 5
for d in col.paginate(query=query_filter, limit=5, projection={'email': 1, 'name': 1},
ordering_field='name', ordering=ASCENDING):
print(d.response)
print(d.batch_size)
# Paginate manually in batches of 5
page = col.paginate(query=query_filter, limit=5, projection={'email': 1, 'name': 1},
ordering_field='name', ordering=ASCENDING, automatic_pagination=False)
# ahead (next five documents)
next_batch_of_five = col.paginate(query=query_filter, limit=5, projection={'email': 1, 'name': 1},
ordering_field='name', ordering=ASCENDING, automatic_pagination=False, next_page=page.next_page)
# back (prev five documents from next_batch_of_five situation)
prev_batch_of_five = col.paginate(query=query_filter, limit=5, projection={'email': 1, 'name': 1},
ordering_field='name', ordering=ASCENDING, automatic_pagination=False, next_page=next_batch_of_five.prev_page)
This method is intended when you just started a new project from scratch or for existing projects if you are willing to substitute every MongoClient instance for MongoClientWithPagination.
Explicit API
from mongonator import Paginate, ASCENDING
from pymongo import MongoClient
MONGO_URI = 'mongodb://[user]:[password]@[host]:[port]/admin'
DATABASE = 'database'
COLLECTION = 'collection'
query_filter = {'name': {'$ne': None}}
# Instantiate MongoClient from pymongo
with MongoClient(MONGO_URI) as mongo_client:
db = mongo_client[DATABASE]
col = db[COLLECTION]
# Manual pagination in batches of 2
paginator = Paginate(
collection=col,
query=query_filter,
limit=2,
ordering_field='email',
ordering_case=ASCENDING,
projection={'email': 1, 'name': 1},
automatic_pagination=False
).paginate()
# Print results
print("Response: ", paginator.response)
print("Prev page: ", paginator.prev_page)
print("Next page: ", paginator.next_page)
print("Batch size: ", paginator.batch_size)
# Manual pagination for two next results...
paginator = Paginate(
collection=col,
query=query_filter,
limit=2,
ordering_field='email',
ordering_case=ASCENDING,
projection={'email': 1, 'name': 1},
automatic_pagination=False,
next_page=paginator.next_page,
).paginate()
# Print results
print("Response: ", paginator.response)
print("Prev page: ", paginator.prev_page)
print("Next page: ", paginator.next_page)
print("Batch size: ", paginator.batch_size)
# ... Or simply use automatic pagination in batches of 2 (starting in first document)
for d in Paginate(
collection=col,
query=query_filter,
limit=2,
ordering_field='email',
ordering_case=ASCENDING,
projection={'email': 1, 'name': 1},
automatic_pagination=True,
).paginate():
print(d.response)
This method is intended when you have a big project in production and is not possible to substitute every MongoClient call.
Metadata
Release files for PyMongonnator 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| PyMongonnator-1.0.4.tar.gz | 10.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| PyMongonnator-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.4 kB
Release files / PyMongonnator-1.0.4.tar.gz
| Download URL | PyMongonnator-1.0.4.tar.gz |
|---|---|
| Size | 10.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38705452681fff506200a83f23adf759a1cb10a7ab4846d383e1e400197d867b
|
|
BLAKE2b-256 checksum How to use checksums |
66053582baed4cc983b81b15a39bcdfcda882fa0bceeb979fdff9802aa188554
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.7.16
|
Release files / PyMongonnator-1.0.4-py3-none-any.whl
| Download URL | PyMongonnator-1.0.4-py3-none-any.whl |
|---|---|
| Size | 12.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c7955e645e11506809676ac19078c40ba2bfc5b0ac4c13f01d483b6adfbfdb1c
|
|
BLAKE2b-256 checksum How to use checksums |
5edf2625df160c5020a75747345c78cb6083c5bbfc111af601e6fef8bc7eafe5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.7.16
|