2015-09-09 3 views
1

Я пытаюсь написать запрос агрегирования в pymongo, но я просто не могу сделать это сам, я пытался с документацией, пытался с помощью google, пытался с помощью Stack Overflow, и я просто не могу найти ответ. Пример из моих данных:Запрос на структуру Pymongo и Aggregation

{"_id": id, "site": "site A", "weekday": 1, "value": 1} 
{"_id": id, "site": "site B", "weekday": 2, "value": 0} 
{"_id": id, "site": "site C", "weekday": 3, "value": 1} 
{"_id": id, "site": "site A", "weekday": 2, "value": 0} 
{"_id": id, "site": "site B", "weekday": 3, "value": -1} 
{"_id": id, "site": "site C", "weekday": 2, "value": 1} 
{"_id": id, "site": "site A", "weekday": 1, "value": -1} 
{"_id": id, "site": "site B", "weekday": 3, "value": 1} 

И что мне нужно:

Для одного сайта, скажем, «сайт А», мне нужен список словарей для каждого дня недели (так 7 всего) с подсчетом " значения "больше 0, равные 0 и меньше 0. Все отсортированы по будним дням.

Так что мой вывод должен выглядеть следующим образом:

{"weekday": 1, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 2, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 3, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 4, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 5, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 6, "greaterCount": x, "lesserCount": y, "zeroCount": z} 
{"weekday": 7, "greaterCount": x, "lesserCount": y, "zeroCount": z} 

конечно же значений greaterCount, lesserCount и zeroCount будет отличаться для разных будням, есть х, у и г в каждом словаре в моем выходе образца из-за Мне лень.

ответ

1

Что вы в основном ищете, это оператор $cond. Это «тернарное» условие, которое вычисляет возврат значения из true/false логического состояния.

В этом случае каждый «логический» тест смотрит на текущем поле «значение» и определяет, где true к испытанию таким, как $gt ли возвращать положительное значение $sum или 0 значение вместо:

db.collection.aggregate([ 
    { "$group": { 
     "_id": "$weekday", 
     "greaterCount": { 
      "$sum": { 
       "$cond": [ 
        { "$gt": [ "$value", 0 ] }, 
        1, 
        0 
       ] 
      } 
     }, 
     "lesserCount": { 
      "$sum": { 
       "$cond": [ 
        { "$lt": [ "$value", 0 ] }, 
        1, 
        0 
       ] 
      } 
     }, 
     "zeroCount": { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ "$value", 0 ] }, 
        1, 
        0 
       ] 
      } 
     } 

    }} 
]) 

Который производит на образце:

{ "_id" : 3, "greaterCount" : 2, "lesserCount" : 1, "zeroCount" : 0 } 
{ "_id" : 2, "greaterCount" : 1, "lesserCount" : 0, "zeroCount" : 2 } 
{ "_id" : 1, "greaterCount" : 1, "lesserCount" : 1, "zeroCount" : 0 } 
+0

Это то, что я пропустил, $ cond делает его довольно простым. Хотя количество скобок в запросах агрегирования по-прежнему подавляющее. Спасибо за помощь! – lenartowski

Смежные вопросы