Bonjour les bons développeurs,
Je suis nouveau dans MongoDB et j'essaie de récupérer des données conditionnelles pour mes besoins.
J'ai la collection suivante:
db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})
Je veux obtenir des données comme celles-ci
ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons
J'essaie d'exécuter la commande suivante
[ { "id":10001, "name":"Test 1", "status":"live", "traffics":[ { "id":"1a3s5d435a4sd", "status":"", }, { "id":"1a3s5d44as54d35a4sd", "status":"CMP", }, { "id":"a3s5d454asd34asd", "status":"", }, { "id":"1a35sd45a4sd34asd3", "status":"TERM", }, { "id":"as35d435a4sd354as3d43asd4", "status":"CMP", }, { "id":"135as4d5a4sd354a3s5d43asd", "status":"CMP", }, { "id":"123as1d31a3d12ads13as", "status":"TERM", } ] }, {...},{...} ]
mais je ne Je ne sais pas comment obtenir des données conditionnelles là-dedans
3 Réponses :
Je pense que vous devrez peut-être exécuter des instructions d'agrégation indépendantes et utiliser une instruction $ match.
$match: { status: "CMP" } $match: { status: "TERM" } $match: { status: "" }
Essayez ce code. L'opérateur $ filter est disponible à partir de la version Mongodb 3.2.
db.inventory.aggregate( [ { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}}, terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}}, abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}}, _id: 0} } ] )
J'espère avoir de l'aide
Salut Yones, merci. Cela m'a beaucoup aidé et j'ai pu en tirer ma requête. mongoplayground.net/p/TcuLlJShclA
J'ai pu modifier un peu la réponse @Yones afin de pouvoir obtenir le nombre d'enregistrements en fonction des conditions.
Voici donc ma requête à ce sujet.
db.collection.aggregate({ $project: { id: 1, name: 1, status: 1, starts: {$size: "$traffics"}, completes: { $size: { $filter: { input: "$traffics", as: "item", cond: { $eq: [ "$$item.status", "CMP" ] } } } }, terminates: { $size: { $filter: { input: "$traffics", as: "item", cond: { $eq: [ "$$item.status", "TERM" ] } } } }, abandons: { $size: { $filter: { input: "$traffics", as: "item", cond: { $eq: [ "$$item.status", "" ] } } } }, _id: 0 } })
Je filtre simplement les enregistrements en fonction de mes conditions en utilisant $ filter
Et puis je calcule sa taille en utilisant $ size.
Voici un exemple de travail pour cette réponse: https://mongoplayground.net/p/TcuLlJShclA