MongoDB如何查询嵌套对象子属性数量大于0的文档?
解决MongoDB筛选嵌套对象属性数量大于0的问题
嘿,我明白你遇到的问题了——你想用$size来判断对象的属性数量,但它确实只对数组生效,所以之前的查询才会返回所有文档。下面给你两种可行的解决方案:
方法一:使用$expr + $objectToArray + $size(通用型)
这种方法适合需要明确判断对象属性数量的场景,通过$objectToArray把嵌套对象转换成键值对数组,再用$size获取数组长度,最后判断长度是否大于0:
db.collection.find({ $expr: { $gt: [ { $size: { $objectToArray: "$something.childThing" } }, 0 ] } })
原理说明:
$objectToArray会把something.childThing这个对象转成类似[{k: "type", v: "blah"}]的数组$size计算这个数组的长度,空对象会被转成空数组,长度为0$gt判断长度大于0,就能筛选出有属性的childThing文档
方法二:直接判断对象不等于空对象(简洁高效)
如果你的需求只是排除childThing为空对象的文档,直接用$ne(不等于)匹配空对象{}就可以了,写法更简单:
db.collection.find({ "something.childThing": { $ne: {} } })
这个方法的逻辑是:MongoDB中空对象{}和包含任意属性的对象是不相等的,所以这个查询会自动过滤掉childThing是空对象的文档,返回符合要求的结果。
两种方法在你的场景下都能正常工作,第二种更简洁高效,推荐优先使用~
内容的提问来源于stack exchange,提问作者mikeb
相关产品推荐
相关产品推荐

