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)?
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.
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",
[]
]
}
}
}}
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" }
}