我有一个MongoDB集合,其中包含以下格式的文档:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
我目前可以获得与特定数组大小匹配的文档:
db.accommodations.find({ name : { $size : 2 }})
这正确地返回 name
数组中包含2个元素的文档 . 但是,我无法执行 $gt
命令来返回 name
字段的数组大小大于2的所有文档:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
如何选择大小大于1的 name
数组的所有文档(最好不必修改当前数据结构)?
10 回答
现在有一种更有效的方法可以在MongoDB 2.2中执行此操作,因为您可以在查询对象键中使用数字数组索引 .
您可以使用使用部分过滤器表达式的索引来支持此查询(需要3.2):
Update:
对于mongodb版本 2.2+ 更有效的方法来执行 @JohnnyHK 描述的另一个answer .
1.使用$where
但...
2.创建 extra 字段
NamesArrayLength
,使用名称数组长度更新它,然后在查询中使用:这将是更好的解决方案,并且将更快地工作(您可以在其上创建索引) .
你也可以使用聚合:
//将“size_of_name”添加到传输文档,并使用它来过滤名称的大小
尝试做这样的事情:
1是数字,如果你想获取大于50的记录然后做ArrayName.50谢谢 .
以上都不适合我 . 这个人这样做了我分享它:
虽然上面的答案都可行,但你最初尝试做的是正确的方法,但是你只需要向后语法(切换“$ size”和“$ gt”) .
正确:
不正确:
我相信这是回答您问题的最快查询,因为它不使用解释的
$where
子句:它的意思是“除了没有名字的那些文件(非存在或空数组)或只有一个名称的所有文件 . ”
测试:
您可以使用$expr(3.6 mongo版本运算符)在常规查询中使用聚合函数 .
比较query operators与aggregation comparison operators .
我找到了这个解决方案,找到数组字段大于一定长度的项目
第一个$ match聚合使用对所有文档都为true的参数 . 如果空白,我会得到