MongoDB - аргумент $ size должен быть массивом, но имеет тип: EOO/missing
Попытка создать источник данных MongoDB с icCube. Идея состоит в том, чтобы вернуть размер массива в новое поле. Что-то вроде:
$project:
{
"people": 1,
"Count myFieldArray" : {$size : "$myFieldArray" }
}
Но я получаю для некоторых записей следующую ошибку:
The argument to $size must be an Array, but was of type: EOO
Есть ли способ, которым этот размер равен 0, если поле пустое или не массив (избавление от ошибки)?
Ответы
Ответ 1
Здесь вы можете использовать $ifNull
. Кажется, что поле является либо не массивом, либо отсутствием данной ошибки:
{ "$project": {
"people": 1,
"Count": {
"$size": { "$ifNull": [ "$myFieldArray", [] ] }
}
}}
Также вы можете проверить $type
в $match
, если они существуют, но не являются массивом.
Ответ 2
Альтернативным решением будет удалить документы с нулями, используя
$match: {myFieldArray: { $elemMatch: { $exists: true } }}
Кроме того, поля документа, которые используются в качестве аргументов для $ size по ссылке '$' (здесь: "$ myFieldArray") также должны быть частью проекций.
$project:
{
"people": 1,
"myFieldArray":1,
"Count myFieldArray" : {$size : "$myFieldArray" }
}
Ответ 3
Начиная с MongoDB 3.2 и новее, вы можете использовать $isArray
, чтобы проверить, является ли ваше поле массивом, вместе с оператором $cond
, чтобы вернуть поле при оценке с помощью $isArray
:
{ "$project": {
"people": 1,
"myFieldArrayCount": {
"$size": {
"$cond": [
{ "$isArray": "$myFieldArray" },
"$myFieldArray",
[]
]
}
}
}}