web-dev-qa-db-ja.com

MongoDB-$ sizeの引数は配列である必要がありますが、タイプはEOO / missingです

icCube でMongoDBデータソースを作成しようとしています。アイデアは、配列のサイズを新しいフィールドとして返すことです。何かのようなもの :

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

しかし、私はいくつかのレコードで次のエラーを取得しています:

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

フィールドが空であるか、配列ではない(エラーを取り除く)場合にサイズが0になる方法はありますか?

48
ic3

$ifNull ここに演算子。フィールドは配列ではないか、指定されたエラーによって存在しないようです:

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

また、 $type あなたの $match これらは存在するが配列ではない場合。

94
Neil Lunn

MongoDB 3.2以降では、 $isArray フィールドが $cond 演算子 $isArray

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

代替ソリューションは、nullを含むドキュメントを削除することです

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

また、「$」参照による$ sizeの引数として使用されるドキュメントフィールド(ここでは、「$ myFieldArray」)も投影の一部である必要があります。

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