2013-07-25 2 views
1

J'ai une agrégation que les groupes à une date et crée une somme.MongoDB globale à l'aide distincte

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 
    } 
}) 

La sortie est

"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 

jusqu'à présent si bon. Ce que je dois faire maintenant est de garder ceci, mais aussi d'ajouter un critère distinct (pour l'argument je veux utiliser AccountId). Le me donnerait le compte des dates groupées en utilisant seulement AccountId distinct. Est-ce que même distinct est possible dans le cadre d'agrégation?

Répondre

0

vous pouvez utiliser deux commandes groupe dans le pipeline, le premier à groupe par accoundId, suivi par le second groupe qui ne fonctionnement habituel. quelque chose comme ceci:

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

se référer à la dernière ligne ici qui mappe de SQL distinct à l'opération mongo équivalente: http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ – Jayz

+0

Ceci ne fonctionne certainement pas puisque le premier groupe se débarrasser du champ notificationDate. – zsong

+0

yup, désolé de négliger cela. alors ajoutez notificationDate au premier groupe. voir la réponse éditée. – 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

Je pense que vous pourriez vraiment être à la recherche d'un seul groupe (anglais est un peu confus) comme ceci:

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 
    } 
}) 

j'ajouter le composé _id dans le $ groupe en raison de:

Le serait me donner le compte des dates groupées en utilisant seulement AccountId distinct.

Ce qui me fait penser que vous voulez que la date groupée compte par ID de compte.

Questions connexes