Source code for mongoUtils.examples
"""**some examples**
:example_001:
- `see question in stack overflow <http://stackoverflow.com/questions/31526793/aggr
egate-group-by-query-in-mongodb-showing-top-5-count-results-by-date>`_
:Usage:
>>> example = Examples(); example.ex001()
>>> res = example.ex001(1)
stage#= 1...
stage#= 2...
"""
from random import randint
from datetime import datetime, timedelta
from bson import SON
from Hellas.Delphi import DotDot
from mongoUtils.aggregation import Aggregation
from mongoUtils.client import muClient # or alternatively this client
from mongoUtils.configuration import testDbConStr # import connection string
client = muClient(testDbConStr) # establish a client connection
db = client.get_default_database()
[docs]class Examples(object):
[docs] def __init__(self):
pass
@classmethod
[docs] def random_date(cls, start, end):
return start + timedelta(seconds=randint(0, int((end - start).total_seconds())))
@classmethod
[docs] def ex001_insertdocs(cls, n_docs):
"""inserts test docs to collection"""
categories = ('food', 'news', 'tv', 'gossip', 'football', 'tennis', 'cinema', 'recipes')
d1 = datetime.strptime('5/1/2015', '%m/%d/%Y') # starting date
d2 = datetime.strptime('6/1/2015', '%m/%d/%Y') # ending date
def random_doc():
cat_lst = []
for i in range(1, randint(2, 5)):
cat_lst.append(categories[randint(0, len(categories) - 1)])
cat_lst = list(set(cat_lst)) # remove duplicates
cat_lst = [{'title': i} for i in cat_lst]
doc = DotDot({'article': {'category': cat_lst}, 'published': cls.random_date(d1, d2)})
return doc
db.drop_collection('ex_001')
for i in range(1, n_docs):
db.ex_001.insert_one(random_doc())
return db.ex001
@classmethod
[docs] def ex001_aggregate(cls, print_n=2):
"""performs aggregation and prints results of each stage in pipeline"""
ag = Aggregation(db.ex_001)
print ("original", db.ex_001.find_one())
ag.project({'yymmdd': {'$dateToString': {'date': '$published', 'format': '%Y-%m-%d'}}, 'article': '$article'})
ag(print_n)
ag.unwind('$article.category')
ag(print_n)
ag.group({'_id': {'yymmdd': '$yymmdd', 'title': '$article.category.title'}, 'count': {'$sum': 1}})
ag(print_n)
ag.sort(SON([('_id.yymmdd', 1), ('count', - 1)]))
ag(print_n)
ag.group({'_id': '$_id.yymmdd', 'item': {'$push': {'item': '$_id.title', 'count': '$count'}}})
ag(print_n)
return ag
@classmethod
[docs] def ex001(cls, print_n=10):
cls.ex001_insertdocs(10000)
return cls.ex001_aggregate(print_n)
ex_cl = Examples() # ; ex_cl.ex001()