Je suis coincé et confondu avec mon expression agrégée actuelle et j'espérais sur une entrée ou une solution dans Mongo lui-même.groupe d'agrégats mongo avec groupe interne/compte sur tableau
Les données d'origine de Mongo (simplifié aux seuls domaines dont j'ai besoin en ce moment):
[{
'status': 'Cancelled',
'CIC Package': 'Test Gallery Cafe',
},
{
'status': 'Completed',
'CIC Package': 'Design Thinking workshop'
},
{
'status': 'Tentative',
'CIC Package': 'Design Thinking workshop'
},
{
'status': 'Confirmed',
'CIC Package': 'Product/solution demonstration'
},
....etc
]
En général ... il y a 1000s des dossiers de probablement 8 'packages CIC avec des statuts différents (Confirmé , Annulé, Tentative, Complété) et d'autres données que j'ai exclues pour le moment.
Le résultat final Je cherche quelque chose comme ceci:
[{
"_id" : "Test Gallery Café",
"package" : "Test Gallery Café",
"status" : [
{
"Cancelled": 1
},
{
"Completed": 1
}
]
},
{
"_id" : "Design Thinking workshop",
"package" : "Design Thinking workshop",
"status" : [
{
"Cancelled": 3
},
{
"Completed": 2
}
]
},
{
"_id" : "Product/solution demonstration",
"package" : "Product/solution demonstration",
"status" : [
{
"Completed": 10
},
{
"Cancelled": 3
},
{
"Confirmed": 1
}
]
}]
donc par CIC package
que je retitré à package
dans le $group
je veux avoir un compte de chaque situation qui existe dans l'ensemble de données. Les statuts et les paquets ne sont pas sous mon contrôle, donc au fil du temps de nouveaux pourraient être ajoutés. Il doit être un groupe dynamique.
Je suis venu aussi loin que cela:
db.reportData.aggregate([
{
$project:
{
'CIC package': 1,
'Status': 1
}
}
,
{
$group:
{
_id: '$CIC package',
package:
{
$first: '$CIC package'
}
,
status:
{
$push: '$Status'
}
}
}
]).toArray()
qui a abouti à quelque chose aime ceci:
[{
"_id" : "Test Gallery Café",
"package" : "Test Gallery Café",
"status" : [
"Cancelled",
"Completed"
]
},
{
"_id" : "Design Thinking workshop",
"package" : "Design Thinking workshop",
"status" : [
"Cancelled",
"Cancelled",
"Cancelled",
"Completed",
"Completed"
]
},
{
"_id" : "Product/solution demonstration",
"package" : "Product/solution demonstration",
"status" : [
"Completed",
"Completed",
"Cancelled",
"Processing",
"Cancelled",
"Cancelled",
"Completed",
"Completed",
"Completed",
"Completed",
"Completed",
"Completed",
"Completed",
"Completed",
"Completed",
"Tentative"
]
}]
Ceci est une petite extraction d'un ensemble beaucoup plus vaste, mais un bon échantillon de la résultat jusqu'à présent.
J'ai essayé unwind
après le dernier group
qui crée de nouveaux enregistrements que je pourrais encore group
, mais je suis un peu confus en ce moment. Et peut-être que je le fais inefficacement. Je pense que je suis presque là mais j'aimerais beaucoup une entrée.
Des idées?
Votre pipeline d'agrégation fait référence à plusieurs champs non présents dans votre échantillon de données. S'il vous plaît montrer vos données réelles et le résultat souhaité. –
Les données réelles sont privées, mais je pense que j'ai montré les données sous la table d'origine. Les seuls champs importants sont 'SIS package' et 'Status'. Le principal problème que j'ai est l'ensemble de données supérieur dans mon message, il montre tous les statuts par paquet, mais j'ai besoin d'avoir un compte de chaque statut par paquet. C'est une chose assez complexe à écrire. Je ne sais pas comment le rendre plus clair. – Mattijs
Vous pouvez le rendre plus clair en vous référant à des champs comme "paquet" qui est présent dans vos données et non pas "paquet SIS" ou l'inverse. Notamment vous faites référence à "Date de début" qui n'a aucun équivalent du tout. Si vous en faites trop abstraction dans ce que vous demandez, vous courez le risque que la réponse ne corresponde pas à vos besoins de données. Ou nous courons le risque de beaucoup de communication avec vous parce que vous ne comprenez pas. S'il vous plaît, effacez-le afin que vous demandiez ce dont vous avez réellement besoin. –