为什么不能使用$ size和$ project步骤,然后用$ match过滤结果?

时间:2019-06-26 17:22:49

标签: mongodb aggregation-framework

我在Mongo集合中有这种类型的对象:

[  ...
   {array: ['keyword1', 'keyword2'], someField: "text", ...}
   ...
]

我想使用这样的聚合:

db.getCollection("SomeCollection").aggregate(
    [   ...
        { "$project" : { "size" : {"$size" : "$someField"}}}
        { "$match": {size: {$gte: 2} } }
        ...
])

添加匹配步骤时,出现以下错误消息:

{  
    "ok" : 0.0, 
    "errmsg" : "The argument to $size must be an array, but was of type: missing",
    "code" : NumberInt(17124), 
    "codeName" : "Location17124"
}

我确定存在两个以上元素的数组。

我很好奇为什么会出现此错误。作为记录,我有一种在“ coll.find”查询中使用$ where的解决方法。

1 个答案:

答案 0 :(得分:0)

由于第一阶段正在将非数组字段(someField)传递给$size运算符,因此聚合返回错误。传递给$ size must resolve to an array的值:

  

$ size的参数必须解析为数组。如果参数为   $ size丢失或无法解析为数组,$ size错误。

还值得注意的是,错误是说but was of type: missing,因为文档中的字段具有与集合(somefield)不同的名称(someField),这意味着该集合没有将任何值传递给$size运算符。