首页 > 解决方案 > 为什么我不能使用 $size 和 $project 步骤,然后用 $match 过滤结果?

问题描述

我在 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"
}

我确定有超过 2 个元素的数组。

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

标签: mongodbaggregation-framework

解决方案


聚合返回错误,因为第一阶段将非数组字段 ( someField) 传递给$size运算符。传递给 $size 的值必须解析为数组

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

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


推荐阅读