2017-01-12 2 views
1

Я использую асинхронный клиент Motor для mongoDB в текущем проекте, и я бы хотел использовать агрегацию типа group by для запроса. Документы содержат краткую информацию о группе, но примеров нет.Как сгруппировать в Motor 1.1?

Параметры:

  1. ключа: поля в группу по (смотрите выше описания)
  2. условие: спецификация строк, которые будут рассматриваться (как находка() запрос спецификации)
  3. начальные: начальные значение объекта агрегации счетчика
  4. уменьшают: функцию агрегации в виде строки JavaScript

Я не знаю, что именно означает начальный параметр и уменьшает (как строку javascript?). Можете ли вы представить пример?

+0

Я понял, что двигатель может использовать совокупный метод, в котором мы можем применить трубопроводы, которые используют родную MongoDB запрос Ланг. Но я хотел бы узнать о методе group(). – Oleksiy

ответ

1

Метод двигателя group принимает те же параметры, что и PyMongo's. Адаптация PyMongo group example к двигателю:

from bson.code import Code 
from tornado import ioloop, gen 
from motor import MotorClient 

reducer = Code(""" 
       function(obj, prev){ 
       prev.count++; 
       } 
       """) 

db = MotorClient().test 


@gen.coroutine 
def example(): 
    yield db.things.remove({}) 
    yield db.things.insert_many([ 
     {'x': 1}, 
     {'x': 2}, 
     {'x': 2}, 
     {'x': 3}, 
    ]) 

    results = yield db.things.group(key={"x": 1}, condition={}, 
            initial={"count": 0}, reduce=reducer) 
    for doc in results: 
     print(doc) 


ioloop.IOLoop.current().run_sync(example) 

Это печатает:

{'count': 1.0, 'x': 1.0} 
{'count': 2.0, 'x': 2.0} 
{'count': 1.0, 'x': 3.0} 
+0

Однако агрегирование выполняется быстрее, работает в порядке и использует индексы. Я рекомендую структуру агрегации над «группой». –

+0

Итак, действительно нужен код js в редукторе? Что касается агрегации: он содержит меньше кода и, кажется, проще:> только nosql для mongo – Oleksiy