2017-07-10 5 views
0

Ma collection ressemblera à ceci,MongoDB global groupe multiple par des champs supérieurs et les champs de tableau

{ 
"_id" : ObjectId("591c5971240033283736860a"), 
"status" : "Done", 
"createdDate" : ISODate("2017-05-17T14:09:20.653Z") 
"communications" : [ 
    { 
     "communicationUUID" : "df07948e-4a14-468e-beb1-db55ff72b215", 
     "communicationType" : "CALL", 
     "recipientId" : 12345, 
     "createdDate" : ISODate("2017-05-18T14:09:20.653Z") 
     "callResponse" : { 
      "Status" : "completed", 
      "id" : "dsd45554545ds92a9bd2c12e0e6436d", 
     } 
    } 
]} 
{ 
"_id" : ObjectId("45sdsd59124003345121450a"), 
"status" : "ToDo", 
"createdDate" : ISODate("2017-05-17T14:09:20.653Z") 
"communications" : [ 
    { 
     "communicationUUID" : "45sds55-4a14-468e-beb1-db55ff72b215", 
     "communicationType" : "CALL", 
     "recipientId" : 1234, 
     "createdDate" : ISODate("2017-05-18T14:09:20.653Z") 
     "callResponse" : { 
      "Status" : "completed", 
      "id" : "84fe862f1924455dsds5556436d", 
     } 
    } 
]} 

Actuellement, je vous écris deux requête globale pour atteindre mon exigence et ma requête sera inférieure

db.collection.aggregate(
{ $project: { 
     dayMonthYear: { $dateToString: { format: "%d/%m/%Y", date: "$createdDate" } }, 
     status: 1, 
}}, 
{ $group: { 
    _id: "$dayMonthYear", 
    Pending: { $sum: { $cond : [{ $eq : ["$status", "ToDo"]}, 1, 0]} }, 
    InProgress: { $sum: { $cond : [{ $eq : ["$status", "InProgress"]}, 1, 0]} }, 
    Done: { $sum: { $cond : [{ $eq : ["$status", "Done"]}, 1, 0]} }, 
    Total: { $sum: 1 } 
}} 

Ma sortie sera,

{"_id" : "17/05/2017", "Pending" : 1.0, "InProgress" : 0.0, "Done" : 1.0, "Total" : 2.0 } 

L'utilisation ci-dessus requête que je peux en mesure d'obtenir le nombre mais je dois trouver la base de la communication statut trop donc je suis en train d'écrire une autre requête pour obtenir,

db.collection.aggregate(
{"$unwind":"$communications"}, 
{ $project: { 
    dayMonthYear: { $dateToString: { format: "%d/%m/%Y", date: "$createdDate" } }, 
    communications: 1 
}}, 
{ "$group": { 
    _id: "$dayMonthYear", 
    "total_call": { $sum: { $cond : [{ $or : [ { $eq: [ "$communications.callResponse.Status", "failed"] }, 
               { $eq: [ "$communications.callResponse.Status", "busy"] }, 
               { $eq: [ "$communications.callResponse.Status", "completed"] }, 
               { $eq: [ "$communications.callResponse.Status", "no-answer"] } 
             ]}, 1, 0 ] }}, 
    "engaged": { $addToSet: { $cond : [{ $eq : ["$communications.callResponse.Status", "completed"]}, 
               "$communications.recipientId", "null" ]} }, 
    "not_engaged": { $addToSet: { $cond: [{ $or : [ { $eq: [ "$communications.callResponse.Status", "failed"] }, 
                  { $eq: [ "$communications.callResponse.Status", "busy"] }, 
                  { $eq: [ "$communications.callResponse.Status", "no-answer"] } ]}, 
               "$communications.recipientId", "null" ] }} 
}}, 
{ "$project": { 
    "_id": 1, 
    "total_call": 1, 
    "engaged": { "$setDifference": [ "$ngaged", ["null"] ] }, 
    "not_engaged": { "$setDifference": [ "$not_engaged", ["null"] ] }, 
}}, 
{ "$project": { 
    "total_call": 1, 
    "engaged": { "$size": "$engaged" }, 
    "not_engaged": { "$size": { "$setDifference": [ "$not_engaged", "$engaged" ] }}, 
}}) 

Ma sortie sera,

{"_id" : "18/05/2017", "total_call" : 2.0, "engaged" : 2, "not_engaged" : 0} 

L'utilisation ci-dessus requête que je peux compter en mesure d'obtenir, mais je veux y parvenir en simple requête

Je cherche une sortie comme

{"_id":"17/05/2017", "Pending" : 1.0, "InProgress" : 0.0, "Done" : 1.0, "total_call" : 0, "engaged" : 0, "not_engaged" : 0} 
{"_id":"18/05/2017", "Pending" : 0.0, "InProgress" : 0.0, "Done" : 0.0, "total_call" : 2, "engaged" : 2, "not_engaged" : 0} 

Quelqu'un peut-il suggérer ou me fournir un bon moyen d'obtenir plus haut résultat.

Répondre

1

Vous pouvez utiliser $concatArrays pour fusionner les documents status & createdDate suivie par $group pour compter les occurrences.

db.collection.aggregate([ 
    { 
    "$project": { 
     "statusandcreateddate": { 
     "$concatArrays": [ 
      [ 
      { 
       "status": "$status", 
       "createdDate": "$createdDate" 
      } 
      ], 
      { 
      "$map": { 
       "input": "$communications", 
       "as": "l", 
       "in": { 
       "status": "$$l.callResponse.Status", 
       "createdDate": "$$l.createdDate" 
       } 
      } 
      } 
     ] 
     } 
    } 
    }, 
    { 
    "$unwind": "$statusandcreateddate" 
    }, 
    { 
    "$group": { 
     "_id": { 
     "$dateToString": { 
      "format": "%d/%m/%Y", 
      "date": "$statusandcreateddate.createdDate" 
     } 
     }, 
     "total_call": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$or": [ 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "failed" 
        ] 
       }, 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "busy" 
        ] 
       }, 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "completed" 
        ] 
       }, 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "no-answer" 
        ] 
       } 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "engaged": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$eq": [ 
       "$statusandcreateddate.status", 
       "completed" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "not_engaged": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$or": [ 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "failed" 
        ] 
       }, 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "busy" 
        ] 
       }, 
       { 
        "$eq": [ 
        "$statusandcreateddate.status", 
        "no-answer" 
        ] 
       } 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "Pending": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$eq": [ 
       "$statusandcreateddate.status", 
       "ToDo" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "InProgress": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$eq": [ 
       "$statusandcreateddate.status", 
       "InProgress" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     "Done": { 
     "$sum": { 
      "$cond": [ 
      { 
       "$eq": [ 
       "$statusandcreateddate.status", 
       "Done" 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     } 
    } 
    } 
]) 
+0

Merci pour votre suggestion. J'ai fait une petite erreur sur ma sortie. En fait, la seconde agrégation se penchera sur l'objet de communication "createdDate" et non sur le ROOT. –

+0

Np. J'ai mis à jour la réponse. S'il vous plaît vérifier – Veeram

+0

Ses œuvres comme de charme, Merci. Lors de l'utilisation de ** concatArrays **, nous pouvons ajouter des critères distincts pour l'état de niveau supérieur et l'état du niveau de communication –