Convert query parameters from API urls to MongoDB queries !
Project description
MongoDBQueriesManager
Convert query parameters from API urls to MongoDB queries !
This project was inspired by api-query-params (JS Library).
Features:
- Powerful: Supports most of MongoDB operators ($in, $regexp, ...) and features (nested objects, type casting, ...)
- Agnostic: Works with any web frameworks (Flask, Sanic, ...) and/or MongoDB libraries (pymongo, motor, ...)
- Simple: ~150 LOC, Python typing
- Tested: 100% tested
Installation:
pipenv install mongo-queries-manager
Usages:
Api
mqm(string_query: str, casters: Optional[Dict[str, Callable]] = None) -> Dict[str, Any]
Description
Converts string_query
into a MongoDB query dict.
Arguments
string_query
: query string of the requested API URL (ie,frist_name=John&limit=10
), Works with url encoded. [required]casters
: Custom caster dict, used to define custom type (ie,casters={'string': str}
/price=string(5.5)
->{'price': '5'}
) [optional]
Returns
The resulting dictionary contains the following properties:
filter
: Contains the query criteria.sort
: Contains the sort criteria (cursor modifiers).skip
: Contains the skip criteria (cursor modifiers).limit
: Contains the limit criteria (cursor modifiers).
Exception
In case of error the following exception was raised:
MongoDBQueriesManagerBaseError
: Base MongoDBQueriesManager errors.SkipError
: Raised when skip is negative / bad value.LimitError
: Raised when limit is negative / bad value.ListOperatorError
: Raised list operator was not possible.FilterError
: Raised when parse filter method fail to find a valid match.CustomCasterFail
: Raised when a custom cast fail.
Examples:
Simple demo
from mongo_queries_manager import mqm
mongodb_query = mqm(string_query="status=sent&price>=5.6&active=true×tamp>"
"2016-01-01&author.firstName=/john/i&limit=100&skip=50&sort=-timestamp")
#{
# 'filter':
# {
# 'status': 'sent',
# 'price': {'$gte': 5.6},
# 'active': True,
# 'timestamp': {'$gt': datetime.datetime(2016, 1, 1, 0, 0)},
# 'author.firstName': re.compile('/john/i')
# },
# 'sort': [('timestamp', -1)],
# 'skip': 50,
# 'limit': 100
#}
Examples with PyMongo
from typing import Dict, Any
from pymongo import MongoClient
from pymongo.collection import Collection
from pymongo.database import Database
from mongo_queries_manager import mqm
client: MongoClient = MongoClient('localhost', 27017)
db: Database = client['test-database']
collection: Collection = db['test-collection']
mongodb_query: Dict[str, Any] = mqm(string_query="status=sent&toto=true×tamp>2016-01-01&"
"author.firstName=/john/i&limit=100&skip=50&sort=-timestamp")
result = collection.find(**mongodb_query)
Supported features
Filter operators:
MongoDB | URI | Example | Result |
---|---|---|---|
$eq |
key=val |
type=public |
{'filter': {'type': 'public'}} |
$gt |
key>val |
count>5 |
{'filter': {'count': {'$gt': 5}}} |
$gte |
key>=val |
rating>=9.5 |
{'filter': {'rating': {'$gte': 9.5}}} |
$lt |
key<val |
createdAt<2016-01-01 |
{'filter': {'createdAt': {'$lt': datetime.datetime(2016, 1, 1, 0, 0)}}} |
$lte |
key<=val |
score<=-5 |
{'filter': {'score': {'$lte': -5}}} |
$ne |
key!=val |
status!=success |
{'filter': {'status': {'$ne': 'success'}}} |
$in |
key=val1,val2 |
country=GB,US |
{'filter': {'country': {'$in': ['GB', 'US']}}} |
$nin |
key!=val1,val2 |
lang!=fr,en |
{'filter': {'lang': {'$nin': ['fr', 'en']}}} |
$exists |
key |
phone |
{'filter': {'phone': {'$exists': True}}} |
$exists |
!key |
!email |
{'filter': {'email': {'$exists': False}}} |
$regex |
key=/value/<opts> |
email=/@gmail\.com$/i |
{'filter': {'email': re.compile('/@gmail.com$/i')}} |
$regex |
key!=/value/<opts> |
phone!=/^06/ |
{'filter': {'phone': { '$not': re.compile('/^06/')}}} |
Skip / Limit operators:
- Default operator keys are
skip
andlimit
. - Used to limit the number of records returned by the query (pagination, result limitation, ...).
- Support empty value (ie,
...&skip=&...
/...&limit=&...
).
from typing import Dict, Any
from mongo_queries_manager import mqm
mongodb_query: Dict[str, Any] = mqm(string_query="skip=50&limit=50")
#{
# 'filter': {},
# 'sort': None,
# 'skip': 50,
# 'limit': 50
#}
mongodb_query: Dict[str, Any] = mqm(string_query="skip=&limit=")
#{
# 'filter': {},
# 'sort': None,
# 'skip': 0,
# 'limit': 0
#}
Sort operator:
- Used to sort returned records.
- Default operator key is
sort
. - Support empty value (ie,
...&sort=&...
). - Sort accepts a comma-separated list of fields.
- Default behavior is to sort in ascending order.
- Use
-
prefixes to sort in descending order, use+
prefixes to sort in ascending order.
from typing import Dict, Any
from mongo_queries_manager import mqm
mongodb_query: Dict[str, Any] = mqm(string_query="sort=created_at,-_id,+price")
#{
# 'filter': {},
# 'sort': [('created_at', 1), ('_id', -1), ('price', 1)],
# 'skip': 0,
# 'limit': 0
#}
Custom caster:
- Used to define custom type
- Optional parameter
from typing import Dict, Any, List
from mongo_queries_manager import mqm
def parse_custom_list(custom_list: str) -> List[str]:
return custom_list.split(';')
query_result: Dict[str, Any] = mqm(string_query="price=string(5)&name=John&in_stock=custom_list(1;2;3;4)&"
"in_stock_string=custom_list(string(1);string(2);string(3);string(4))",
casters={'string': str, 'custom_list': parse_custom_list})
#{
# 'filter':
# {
# 'price': '5',
# 'name': 'John',
# 'in_stock': {'$in': [1, 2, 3, 4]},
# 'in_stock_string': {'$in': ['1', '2', '3', '4']}
# },
# 'sort': None,
# 'skip': 0,
# 'limit': 0
#}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for mongo-queries-manager-0.1.3.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c94808bdbae7c223c8e0d0d60185338524de5987c9e09a608ff6b52e73eba976 |
|
MD5 | 89dc1602a9d3430972c8bda801ca010d |
|
BLAKE2b-256 | 36b04af5f6d02b9b9df7032a7005170d88dd30a8d06df5e22c4c6e91b9f788ca |
Close
Hashes for mongo_queries_manager-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 124bf9b3d74615b63f8d11d608627c55ff7937199e0c79d9c09b1845a21d46b4 |
|
MD5 | 546a3239bbb647b8744652daebba1423 |
|
BLAKE2b-256 | bfa547a5d0f90807e1abc17f9e390405e3fe12adaf3a4f1084c60b31a9f19ca4 |