是否可以为具有奇数大小的数组而不是此数组的文档构建查询过滤器?
db.records.find({'$or': [{'my_array': {'$size': 1}},
{'my_array': {'$size': 3}},
{'my_array': {'$size': 5}},
...
{'my_array': {'$size': 15}}]}))
如果停在某个数字处,过滤器可能无法捕获所有项目。
答案 0 :(得分:3)
您可以使用$where
提供要查询的Javascript表达式:
db.records.find({ $where: "this.my_array.length % 2 == 1" })
将为查询的其余部分匹配的每个文档处理JavaScript表达式,因此为了提高性能,您应该尝试确保查询的其余部分是选择性的。
答案 1 :(得分:3)
您可以使用以下聚合查询$project
size
和data
字段,并使用$mod
函数保留包含奇数大小数组的文档。
db.records.aggregate(
{ $project: { size:{ $size: "$my_array" }, data:"$$ROOT"} },
{ $match: { size: { $mod: [ 2, 1 ] } } }
)