Skip to main content

Python MongoDB aggregation ORM

Project description

mongo_aggregation

Python MongoDB Aggregation ORM class.

Installation

pip install mongo_aggregation

Usage examples

import pymongo
from datetime import datetime
from dateutil.relativedelta import relativedelta
from mongo_aggregation import MongoAggregation

# Usual pymongo connection
client = pymongo.MongoClient('mongodb://localhost:27017/test')
db = client.get_database()
today = datetime.now()
yesterday = today - relativedelta(days=1)

# Compose the pipeline
pipeline = MongoAggregation(collection=db.action)
pipeline.match(
    {'date': {'$gte': yesterday, '$lt': today}},
    completed=True,
    _cls={'$in': [
        'Action.Order', 'Action.StorageIncome', 'Action.StorageCancellation', 'Action.StorageMovementOutcome'
    ]},
).smart_project(
    'transactions.amount,_cls', '_id'
).append([
    {'$project': {
        '_cls': 1,
        'date': 1,
        'transactions.amount': 1,
        'transactions.cashbox': 1,
    }},
]).project(
    {'transactions.amount': 1, 'transactions.cashbox': 1}, _cls=1, date=1
).project(
    transactions=1, _cls=1, date=1
)
# Run it
cursor = pipeline.aggregate()

# Iterate over result
for doc in cursor:
    print(doc)
    break

Methods description

pipeline.sort('-doctor')
# {'$sort': {'doctor': -1}}

pipeline.sort({'doctor': 1})
# {'$sort': {'doctor': 1}}

pipeline.sort('doctor', '-patient')
# [{'$sort': {'doctor': 1}}, {'$sort': {'-patient': 1}}]
  • order_by is an alias to sort.
pipeline.order_by('-doctor')
# {'$sort': {'doctor': -1}}
pipeline.replace_root('doctor')
# {'$replaceRoot': {'newRoot': '$doctor'}}

Returns count. Does not add stage.

pipeline.count()
2

Response as list

By default aggregate returns cursor. If you want it to return a list of documents use as_list argument:

data = pipeline.aggregate(as_list=True)

Patterns module

Provides operators and some other patterns in python functions way.

Imports:

from mongo_aggregation.patterns import regex
and_({'a': True}, b=True, c=True)
# {'$and': [{'a': True}, {'b': True}, {'c': True}]}
or_({'a': True}, b=True, c=True)
# {'$or': [{'a': True}, {'b': True}, {'c': True}]}
regex('name', i=True)
# {'$regex': 'name', '$options': 'i'}

Aggregation patterns module

Provides aggregation operators and some other patterns in python functions way.

Imports:

from mongo_aggregation.aggr_patterns import merge_objects
  • $ifNull
    There are two variations:
if_null('$doctor', {})
{'$ifNull': ['$doctor', {}]}

ifNull('$doctor', '')
{'$ifNull': ['$doctor', '']}

Function looks after dollar prefix, so you can skip it:

if_null('doctor', {})
{'$ifNull': ['$doctor', {}]}
  • $in
    There are two variations:
in_('doctor', 'doctors')
{'$in': ['$doctor', '$doctors']}
merge_objects('$doctor', first_name='John', last_name='Doe')
# {'$mergeObjects': ['$doctor', {'first_name': 'John', 'last_name': 'Doe'}]}

Others

  • obj function
    Returns dictionary with specified fields as keys and values. For better understanding see usage examples below.
>>> obj('name,description')
{'name': '$name', 'description': '$description'}

>>> obj('name', 'description')
{'name': '$name', 'description': '$description'}

>>> obj('name,description', id='$code')
{'name': '$name', 'description': '$description', 'id': '$code'} 

Changelog

1.0.10 (2021-01-19)

  • Fixed bug with multiple operators for a field in a _convert_names_with_underlines_to_dots pattern.

1.0.9 (2020-12-24)

  • Added in_ aggregation pattern.

1.0.8 (2020-12-11)

  • Added and_, and_nor, and_or methods to MongoMatchFilter.

1.0.7 (2020-09-19)

  • Small fix.

1.0.6 (2020-11-19)

  • Added if_null pattern.
  • Removed get_count method. count now returns count and does not add count stage.
  • Added obj pattern.

1.0.5 (2020-09-25)

  • Added order_by method.

1.0.4 (2020-09-25)

  • Bug fixes.

1.0.3 (2020-09-01)

  • .sort now supports -email sorting format (direction and field name by string).
  • Added .replace_root method.
  • Added or_ and and_ logical operators. _and is deprecated now.
  • Added regex operator pattern.
  • Added merge_objects aggregation operator (./aggr_patterns).

1.0.2 (2020-09-01)

  • Added $addFields and $set stages.
  • Added $filter operator.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mongo-aggregation-1.0.11.tar.gz (15.0 kB view details)

Uploaded Source

File details

Details for the file mongo-aggregation-1.0.11.tar.gz.

File metadata

  • Download URL: mongo-aggregation-1.0.11.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

File hashes

Hashes for mongo-aggregation-1.0.11.tar.gz
Algorithm Hash digest
SHA256 39a616ee08ffc6a7d52a571224fd639c626294a2d47199c82cef1debf0e2d206
MD5 fef91ea2d6e36cb70d4f81fbf5c1d9eb
BLAKE2b-256 c3e1d942c05b4552fdcb8f20605e7968bb00eaf01d2838fd5860aa79adc7a2b4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page