2013-07-25 4 views
1

У меня есть агрегация, которая группируется по дате и создает сумму.MongoDB агрегат с использованием отдельных

db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate" 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 

Выход

"result" : [ 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-18T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-18T04:00:00Z"), 
     "count" : 484 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-19T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-19T04:00:00Z"), 
     "count" : 490 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-20T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-20T04:00:00Z"), 
     "count" : 174 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-21T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-21T04:00:00Z"), 
     "count" : 6 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-22T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-22T04:00:00Z"), 
     "count" : 339 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-23T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-23T04:00:00Z"), 
     "count" : 394 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-24T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-24T04:00:00Z"), 
     "count" : 17 
    } 
], 
"ok" : 1 

до сих пор так хорошо. Теперь мне нужно сделать это, но также добавить четкие критерии (для аргументации я хочу использовать AccountId). Это даст мне подсчет сгруппированных дат только с использованием отдельного аккаунта AccountId. Являются ли даже возможными в рамках агрегации?

ответ

0

вы можете использовать две команды группы в конвейере, первая группа, объединенная с accoundId, а затем вторая группа, которая выполняет обычную операцию. что-то вроде этого:

db.InboundWorkItems.aggregate( 
    {$match: {notificationDate: {$gte: ISODate("2013-07-18T04:00:00Z")}, dropType:'drop' }}, 
    {$group: {_id:"accountId",notificationDate:"$notificationDate"}}, 
    {$group: {_id:1, nd: {$first:"$notificationDate"}, count:{$sum:1} }}, 
    {$sort:{nd:1}} ) 
+0

ссылается на последнюю строку здесь, которая отображает от SQL различную эквивалентную операцию mongo: http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ – Jayz

+0

Это определенно не работает, так как первая группа будет избавиться от поля notificationDate. – zsong

+0

yup, извините за это. поэтому добавьте уведомление в первую группу. см. отредактированный ответ. – Jayz

0
db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: "$AccountId", 
     notificationDate: { 
      $max: "$notificationDate" 
     }, 
     dropType: { 
      $max: "$dropType" 
     } 
    } 

}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate" 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 
0

Я думаю, что вы могли бы на самом деле искать для одной группы (английский язык немного сбивает с толку), как так:

db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate", accountId: '$accountId' 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 

добавляю соединение _id в $ из-за:

Это даст мне подсчет сгруппированных дат только с использованием отдельного аккаунта AccountId.

Который заставляет меня думать, что вы хотите, чтобы сгруппированные даты учитывались по идентификатору учетной записи.

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