MongoDB:属性名动态变化时如何查询体重小于1的动物文档?
解决MongoDB动态键下的体重查询问题
因为你的文档中animals下的动物类型(比如cats、mouses)是动态变化的,MongoDB不支持直接用*作为通配符匹配键名,所以得通过对象转数组的方式遍历所有动物类型,再检查体重条件。
直接用find结合$expr就能实现需求,查询语句如下:
db.collection.find({ $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$animals" }, as: "animalType", in: { $anyElementTrue: { $map: { input: "$$animalType.v", as: "animal", in: { $lt: ["$$animal.weight", 1] } } } } } } } })
语句说明:
$objectToArray: "$animals":把animals对象转换成键值对数组,比如第二个文档会转成[{k: "dogs", v: [...]}, {k: "chickens", v: [...]}, {k: "mouses", v: [...]}]- 外层
$map:遍历每个动物类型(比如mouses),拿到对应的动物数组$$animalType.v - 内层
$map:遍历当前动物类型下的每只动物,判断其weight是否小于1,返回布尔值数组 - 内层
$anyElementTrue:检查当前动物类型下是否存在至少一只体重小于1的动物 - 外层
$anyElementTrue:只要animals下有任意一个动物类型符合条件,整个文档就会被匹配
内容的提问来源于stack exchange,提问作者François MENTEC
相关产品推荐
相关产品推荐

