6 votes

Comment ajouter $add à une liste de champs qui peuvent ne pas exister ?

J'ai un document avec la structure ci-dessous, et je veux obtenir un total pour les 2 derniers mois en ajoutant 2013.5 et 2013.4, dans le cadre du processus d'obtention des 10 premiers paquets.

Si j'utilise l'agrégat

db.hits.aggregate(
    {$project:{"total":{"$add":["$value.2013.5", "$value.2013.4"]}}})

cette méthode renvoie une valeur numérique au total uniquement si les deux champs existent dans un document. Si l'un des champs est manquant, le total aura la valeur null. J'ai une idée de la manière dont je peux contourner ce problème. Il y a $group, $sort, $limit qui suivent $project, mais je les ai omis pour plus de clarté.

{
  "_id" : "4e6eef33-d88a-4d4d-a6b2-6becf1be7e8f",
  "value" : {
    "package" : 4498
    "2012" : {
      "1" : 1.0,
      "2" : 1.0,
      "4" : 1.0,
      "6" : 4.0,
      "7" : 2.0,
      "8" : 5.0,
      "12" : 1.0,
      "hits" : 15.0
    },
    "2013" : {
      "1" : 6.0,
      "4" : 2.0,
      "hits" : 8.0
    },
    "hits" : 23.0
  }
}

D'ailleurs, je n'utilise deux mois qu'à titre d'illustration. Normalement, j'utilise 12 mois.

Editer : Ma solution de repli est d'écrire une fonction qui ajoute les champs manquants dans le document. J'aimerais savoir s'il existe un moyen d'éviter cela.

9voto

vinipsmaker Points 523

cette méthode renvoie une valeur numérique au total uniquement si les deux champs existent dans un document.

Si l'un des champs n'existe pas, le traitement est le suivant undefined . undefined est propagée dans toutes les opérations.

Si j'utilise l'agrégat [...]

Vous pouvez utiliser le $ifNull de l'opérateur :

db.hits.aggregate({$project:{"total":{"$add":[{$ifNull: ["$value.2013.5", 0]}, {$ifNull: ["$value.2013.4", 0]}]}}})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X