mongodb - 为什么我不能使用 $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 的解决方法。
解决方案
聚合返回错误,因为第一阶段将非数组字段 ( someField
) 传递给$size
运算符。传递给 $size 的值必须解析为数组:
$size 的参数必须解析为数组。如果 $size 的参数丢失或无法解析为数组,则 $size 错误。
还值得注意的是,错误是but was of type: missing
因为文档中的字段具有与聚合 () 不同的名称 ( somefield
) someField
,这意味着聚合没有向$size
运算符传递任何值。
推荐阅读
- snowflake-cloud-data-platform - 雪花 - 如何引用名称中带有特殊字符的指定表的内部阶段?
- c# - 如何在 Xamarin 中显示带有三个点的工具栏?
- swagger - OpenApi:从多个文件中生成 java/kotlin DTO
- reactjs - 类型断言对象字面量打字稿
- android - 从 Mac 到 Android 的 ADB 连接被拒绝
- perl - 我有两个使用 Perl 转换数据的问题?
- c++ - .eof() 使用数组时替换
- java - 付款时的子值计数器 Firebase Android
- sql - sql中每组的分层抽样
- postgresql - .Net Core 3.0 Npgsql 迁移问题