2014-09-03 1 views
1

Я новичок в mongo и пытаюсь получить сумму общей суммы из моей коллекции mongo db под названием «транзакции», где «заплачено» верно, а «creationDate» - в месяц Сентябрь 2014 года, сгруппированы по дням.Mongo aggregation с агрегацией условных дат

В Postgres, я могу написать это как:

select to_char("creationDate", 'YYYY-MM') as "Month", sum(totalamount) 
from transactions 
where "creationDate" >= '2014-09-01' 
and paid is true 
group by "Month" 

Однако, я не уверен, как добавить условия для CreationDate и уплачиваются в Монго. Я читал об условных агрегациях, но я не уверен, как заставить его работать на день и месяц даты, а также на логические условия.

Образец данных:

{ "totalamount" : 10, "creationDate" : ISODate("2014-09-01T01:00:58.909Z"), "paid" : true} 
{ "totalamount" : 30, "creationDate" : ISODate("2014-09-01T03:00:58.909Z"), "paid" : true} 
{ "totalamount" : 20, "creationDate" : ISODate("2014-09-02T01:00:58.909Z"), "paid" : true} 

Это то, что я пробовал:

db.transactions.aggregate( 
[ 
    { 
     $group: 
      { 
       _id: { 
        day: { $dayOfMonth: "$creationDate"}, 
        month: 
         { 
          $cond: [{ $gte: [$month: "$creationDate", 9]},9,0]         
         }, 
        year: 
         { 
          $cond: [{ $gte: [$year: "$creationDate", 2014]},2014,0]         
         }, 

        }, 
       collected: { 
        $sum: { 
         $cond: [ 
          {"$paid":"true"}, "$totalamount",0] 
        } 
       } 
      } 
    } 
] 
) 

Однако я получаю "SyntaxError: Unexpected token :"

Любые идеи в это было бы очень полезно. Спасибо!

ответ

0

Несколько проблем в нем, так что немного за пределами комментария. В основном вы не включали несколько операторов дат с {} и как таковые производят недопустимый JSON внутри массива. Это помогает, если вы измените стиль отступов, чтобы упростить определение проблем форматирования.

я лично предпочитаю придерживаться полностью строгой JSON нотацию, это хорошо разбирает с другими языками и легче "lint", что-то вы должны смотреть на то, чтобы избежать кодирования синтаксических ошибок в будущем:

db.transactions.aggregate([ 
    { "$group": { 
     "_id": { 
      "day": { "$dayOfMonth": "$creationDate" }, 
      "month": { 
       "$cond": [ 
        { "$gte": [ {"$month": "$creationDate"}, 9 ] }, 
        9, 
        0 
       ]         
      }, 
      "year": { 
       "$cond": [ 
        { "$gte": [ { "$year": "$creationDate" }, 2014] }, 
        2014, 
        0 
       ]         
      } 
     }, 
     "collected": { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ "$paid", "true" ] }, 
        "$totalamount", 
        0 
       ] 
      } 
     } 
    }} 
]) 

Также не было логической проверки с $eq с этим $sum в конце. Сделайте это, вы на самом деле означаете «строковое» значение «true», а не true как простое булево значение в этом случае.

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

  • Нет связанных вопросов^_^