MongoDB - $ size的参数必须是一个数组,但类型为:EOO

ic3*_*ic3 50 mongodb mongodb-query aggregation-framework iccube

尝试使用icCube创建MongoDB数据源.我们的想法是将数组的大小作为新字段返回.就像是 :

$project:
{ 
 "people": 1, 
 "Count myFieldArray" : {$size : "$myFieldArray" }
}
Run Code Online (Sandbox Code Playgroud)

但我得到一些记录以下错误:

The argument to $size must be an Array, but was of type: EOO
Run Code Online (Sandbox Code Playgroud)

如果字段为空或不是数组(摆脱错误),是否有一种方法大小为0?

Nei*_*unn 99

您可以在$ifNull此处使用运算符.看来该字段不是数组,也不是给定错误不存在:

{ "$project": {
    "people": 1,
    "Count": { 
        "$size": { "$ifNull": [ "$myFieldArray", [] ] }
    }
}}
Run Code Online (Sandbox Code Playgroud)

您还可能要来检查$type$match的情况下,这些确实存在,但不是一个数组.

  • 非常感谢它有效。奇怪的是,未定义字段的 $size 不是 0(实际上所有非数组类型都是 0)。我希望非 SQL 数据库更加宽松(以防 mongo 数据库人员读到此内容:-)) (2认同)
  • @ ic3不是真的,这就是为什么`$ ifNull`存在的原因.同样的警告适用于像`$ unwind`这样的运算符,你需要注意数组不是空的或丢失,否则你将导致删除父文档或产生类似的错误. (2认同)

chr*_*dam 10

从 MongoDB 3.2 及更高版本开始,您可以使用以下运算$isArray符来检查字段是否为数组,$cond以在评估时返回字段$isArray

{ "$project": {
    "people": 1,
    "myFieldArrayCount": { 
        "$size": { 
            "$cond": [ 
                { "$isArray": "$myFieldArray" }, 
                "$myFieldArray", 
                []
            ]
        } 
    }
}}
Run Code Online (Sandbox Code Playgroud)