MongoDB$elemMatch显示问题
以下是测试集合中的示例文档 我的要求是只提取*两个字段 “host.name”和“host.config.storageDevice.scsiLun.lunType”匹配“host.config.storageDevice.scsiLun.lunType”:“cdrom1”和“host.name”:“on xxx” 就像我上面提到的,我只希望属性“lunType”显示在数组中,而不是“a”或“b” 我试图同时使用$elemMatch和$projection,但它似乎总是返回数组“lunType”的所有属性……我在这里遗漏了什么吗 试图参考文献 查询 db.test.find({“host.config.storageDevice.scsiLun”:{$elemMatch:{“lunType”:“cdrom1”}}},{“host.name”:1,“host.config.storageDevice.scsiLun.$”:1}) db.test.find({“host.config.storageDevice.scsiLun.lunType”:“cdrom1”},{“host.name”:1,“host.config.storageDevice.scsiLun.$”:1}) 收藏中的文件MongoDB$elemMatch显示问题,mongodb,bson,Mongodb,Bson,以下是测试集合中的示例文档 我的要求是只提取*两个字段 “host.name”和“host.config.storageDevice.scsiLun.lunType”匹配“host.config.storageDevice.scsiLun.lunType”:“cdrom1”和“host.name”:“on xxx” 就像我上面提到的,我只希望属性“lunType”显示在数组中,而不是“a”或“b” 我试图同时使用$elemMatch和$projection,但它似乎总是返回数组“lunType”
$elemMatch所做的只是返回数组中与条件匹配的第一个元素,但它将为您提供整个元素,即“a”和“lunType”属性 使用分解数组,然后过滤并仅显示“lunType”字段,可能会得到所需的结果 我没有测试查询,但它应该是这样的:
db.test.aggregate(
{ $unwind : "$host.config.storageDevice.scsiLun" },
{ $match : { host.name : "on-xxx" ,
host.config.storageDevice.scsiLun.lunType : "cdrom1" } },
{ $project : {
_id : 0 ,
host.config.storageDevice.scsiLun.lunType : 1 }
);
已尝试查询,但无法使其正常工作-db.test.aggregate({$unwind:$host.config.storageDevice.scsiLun},{$match:{{{{“host.name”:“on xxx”},{“host.config.storageDevice.scsiLun.lunType”:“cdrom1”},{$project:{{u id:0,”host.config.storageDevice.scsiLun.lunType:“1}”);这适用于db.test.aggregate({$unwind:$host.config.storageDevice.scsiLun“},{$match:{”host.name:“on xxx”,“host.config.storageDevice.scsiLun.lunType:“disk2”},{$project:{id:{0,“host.name”:1,“host.config.storageDevice scsiLun.lunType:”1})感谢您对语法的更正,我编辑了我的答案以匹配您的语法。
db.test.aggregate(
{ $unwind : "$host.config.storageDevice.scsiLun" },
{ $match : { host.name : "on-xxx" ,
host.config.storageDevice.scsiLun.lunType : "cdrom1" } },
{ $project : {
_id : 0 ,
host.config.storageDevice.scsiLun.lunType : 1 }
);