MongoDB集合中如何检索对象数组内AHU为C的Zone元素
如何在MongoDB中仅返回数组里符合条件的元素?
我明白你现在的问题:当你用db.buildings.find({"zone.AHU": "C"}).pretty()查询时,返回的文档包含了整个对象,甚至包括那些AHU值不是"C"的zone元素。想要只保留数组里符合条件的zone,这里有两种常用的方法,根据你的需求选择:
方法1:用$elemMatch投影(仅返回第一个匹配元素)
如果你只需要数组中第一个符合条件的zone元素,可以用投影里的$elemMatch。它会帮你筛选出数组里第一个匹配查询条件的元素,同时保留你指定的其他字段:
db.buildings.find( {"zone.AHU": "C"}, // 匹配包含AHU=C的zone的文档 { "zone": {$elemMatch: {"AHU": "C"}}, // 仅保留符合条件的第一个zone元素 name: 1, // 显式声明要保留的其他字段 coordinate: 1, yearlyEnergyCost: 1 // _id字段默认会被返回,如果不需要可以加上 "_id": 0 } ).pretty()
方法2:用聚合管道(返回所有匹配元素)
如果你的数组里有多个AHU值为"C"的zone元素,想要全部返回的话,聚合管道是更好的选择。我们可以用$match先过滤出目标文档,再用$filter来筛选数组里的元素:
db.buildings.aggregate([ // 第一步:先筛选出包含AHU=C的zone的文档 {$match: {"zone.AHU": "C"}}, // 第二步:过滤zone数组,只留下AHU=C的元素 {$project: { name: 1, coordinate: 1, yearlyEnergyCost: 1, zone: {$filter: { input: "$zone", // 要过滤的数组 as: "z", // 给数组元素起的别名 cond: {$eq: ["$$z.AHU", "C"]} // 判断条件:元素的AHU等于"C" }} }} ])
如果你的文档有很多其他字段,不想一个个手动列出,可以用$addFields替换$project,这样会保留所有原始字段,只替换掉zone数组:
db.buildings.aggregate([ {$match: {"zone.AHU": "C"}}, {$addFields: { zone: {$filter: { input: "$zone", as: "z", cond: {$eq: ["$$z.AHU", "C"]} }} }} ])
这样返回的结果里,每个文档的zone数组就只会包含AHU值为"C"的元素了。
内容的提问来源于stack exchange,提问作者davislf2
相关产品推荐
相关产品推荐

