Подтвердить что ты не робот

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, если поле пустое или не массив (избавление от ошибки)?

4b9b3361

Ответ 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", 
                []
            ]
        } 
    }
}}