我试图从嵌套数组文档中投影以下格式的值。我希望只显示find查询中选定的特定specValuespecType

{
    "carId": "345677"
    "car" : {
        "model" : [
            {
                "specs" : [
                    {
                        "specType": "SEDAN"
                        "specValue" : "1"
                    },
                    {
                        "specType": "BR_INC"
                        "specValue" : "yes"
                    },
                    {
                        "specType": "PLAN"
                        "specValue" : "gold"
                    }
                ]
            }
        ]
    }
}

这就是我试过的。
db.cars.find({carId:'345677','car.model.specs.specType':'SEDAN'},{'car.model.specs.specValue':1})

这种方法给了我所有的specValues而不是像下面这样。
{
    "carId": "345677"
    "car" : {
        "model" : [
            {
                "specs" : [
                    {
                        "specValue" : "1"
                    },
                    {
                        "specValue" : "yes"
                    },
                    {
                        "specValue" : "gold"
                    }
                ]
            }
        ]
    }
}

我该怎么做才能得到这样正确的格式。有人能帮忙吗?
{
    "carId": "345677"
    "car" : {
        "model" : [
            {
                "specs" : [
                    {
                        "specType": "SEDAN"
                        "specValue" : "1"
                    }
                ]
            }
        ]
    }
}

最佳答案

您可以使用下面的聚合

db.collection.aggregate([
  { "$project": {
    "car": {
      "model": {
        "$filter": {
          "input": {
            "$map": {
              "input": "$car.model",
              "in": {
                "specs": {
                  "$filter": {
                    "input": "$$this.specs",
                    "cond": { "$eq": ["$$this.specType", "SEDAN"] }
                  }
                }
              }
            }
          },
          "cond": { "$ne": ["$$this.specs", []] }
        }
      }
    }
  }}
])

09-18 16:43