web-dev-qa-db-fra.com

MongoDB - L'argument de $ size doit être un tableau, mais était de type: EOO / manquant

Essayer de créer une source de données MongoDB avec icCube . L'idée est de renvoyer la taille d'un tableau en tant que nouveau champ. Quelque chose comme :

$project:
{ 
 "people": 1, 
 "Count myFieldArray" : {$size : "$myFieldArray" }
}

Mais je reçois pour certains enregistrements l'erreur suivante:

The argument to $size must be an Array, but was of type: EOO

Existe-t-il une façon dont la taille est 0 si le champ est vide ou pas un tableau (pour se débarrasser de l'erreur)?

48
ic3

Vous pouvez utiliser le $ifNull opérateur ici. Il semble que le champ ne soit pas un tableau ou qu'il ne soit pas présent par l'erreur donnée:

{ "$project": {
    "people": 1,
    "Count": { 
        "$size": { "$ifNull": [ "$myFieldArray", [] ] }
    }
}}

Aussi, vous voudrez peut-être vérifier la $type dans votre $match au cas où ils existent mais ne sont pas un tableau.

94
Neil Lunn

Depuis MongoDB 3.2 et plus récent, vous pouvez utiliser $isArray pour vérifier si votre champ est un tableau avec $cond opérateur pour retourner le champ lors de l'évaluation avec $isArray :

{ "$project": {
    "people": 1,
    "myFieldArrayCount": { 
        "$size": { 
            "$cond": [ 
                { "$isArray": "$myFieldArray" }, 
                "$myFieldArray", 
                []
            ]
        } 
    }
}}
0
chridam

Une solution alternative serait d'éliminer les documents avec des valeurs nulles en utilisant

$match: {myFieldArray: { $elemMatch: { $exists: true } }}

De plus, les champs de document qui sont utilisés comme arguments pour $ size par la référence '$' (ici: "$ myFieldArray") doivent également faire partie des projections.

$project:
{ 
 "people": 1,
 "myFieldArray":1,
 "Count myFieldArray" : {$size : "$myFieldArray" }
}
0
RSJ