缘由
今天在写一个业务功能的时候,业务实体的某个属性为一个数组,我的其中一个过滤条件为数组长度小于等于某个值
尝试与问题
$size
首先我使用了 $size
1 | db.mission_task_types.find({ |
但,我得到了这个
1 | { |
到现在我才发现,$size 的 value 只接收一个具体的数值,而不能使用范围值
$where
$size 失败了,决定使用不能够利用索引的 $where
1 | db.mission_task_types.find({ |
但,我得到了这个
1 | { |
why?
为什么跟我说 workflow 是 undefined?经过一番折腾,最终我发现了集合中有这么个玩意
1 | { |
突然我明白了,明白了是因为我知道是这个只有 _id 的脏数据导致我得到了这个错误,于是我将查询语句修改了下
1 | db.mission_task_types.find({ |
啊哈,果然!因为脏数据中不存在 workflow 属性,而 $where 的 value 接收的是 JavaScript 的表达式,当 workflow 属性不存在时,调用这个不存在属性的 length 属性时,就抛异常了
注意:因为 $where 不能够使用索引,所以如果一定要使用 $where 时,若有其他查询条件可以利用到索引,请将这些查询条件放到 $where 前面
后记
在我浏览别的博主的文章时,我发现了更高效的方法,那就是使用 $exists 来判断某个数组下标的元素存不存在
例如,查询出数组长度小于等于 6 的
1 | db.mission_task_types.find({ |
若大家有相似需求,推荐使用这种查询方式
拜~
