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