MongoDB Compass中查询L5_tecnologias字段含JAVA的文档数量失败求助
解决MongoDB中统计包含特定键的嵌套对象文档数量问题
看起来你是想统计L5_tecnologias这个嵌套对象中存在JAVA键的文档总数对吧?你之前尝试的几种查询方式都是精确匹配整个字段的结构,这和你的实际数据结构不匹配,所以没生效。
正确的查询命令
如果你的L5_tecnologias是对象结构(就像你截图里展示的那样),要判断它是否包含JAVA这个键(不管对应的值是什么),应该使用$exists操作符:
// MongoDB 3.2+推荐使用的统计方式 db.your_collection_name.countDocuments({ "L5_tecnologias.JAVA": { $exists: true } }) // 适配旧版本MongoDB的统计方式 db.your_collection_name.find({ "L5_tecnologias.JAVA": { $exists: true } }).count()
为什么你之前的查询不生效?
我逐个解释你尝试过的命令问题:
{ L5_tecnologias: { JAVA: "" } }:这个命令要求L5_tecnologias是完全等于{ JAVA: "" }的对象——也就是说它不能有其他任何键,只有JAVA且值为空才会匹配,这显然不是你想要的逻辑。{ L5_tecnologias: ["JAVA"] }:这个是把L5_tecnologias当成数组来精确匹配,但你的实际数据是嵌套对象,所以完全不匹配。{ L5_tecnologias: "JAVA" }:这个是把L5_tecnologias当成字符串来匹配,而你的字段是对象结构,自然不会返回结果。
额外注意事项
如果你的文档中JAVA键名存在大小写不一致的情况(比如有的是小写java),可以结合聚合查询来做不区分大小写的键名匹配:
db.your_collection_name.aggregate([ { $project: { hasJava: { $in: ["JAVA", { $map: { input: { $objectToArray: "$L5_tecnologias" }, as: "tech", in: { $toUpper: "$$tech.k" } }}] } }}, { $match: { hasJava: true } }, { $count: "totalDocuments" } ])
不过如果你的键名都是固定大写的JAVA,用第一种$exists的方法就足够高效了。
内容的提问来源于stack exchange,提问作者Marquez Yannick
相关产品推荐
相关产品推荐

