2
votes

Comment obtenir des champs conditionnels dans Mongodb

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


0 commentaires

3 Réponses :


1
votes

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: ""
}


0 commentaires

4
votes

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


1 commentaires

Salut Yones, merci. Cela m'a beaucoup aidé et j'ai pu en tirer ma requête. mongoplayground.net/p/TcuLlJShclA



3
votes

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


0 commentaires