MongoDB: Как получить только определенные поля в документах с вложенным массивом - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь проецировать значения из документов вложенного массива в следующем формате. Что я ожидаю, так это отобразить только specValue из конкретных specType, выбранных в запросе поиска.

{
    "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"
                    }
                ]
            }
        ]
    }
}

1 Ответ

1 голос
/ 09 июля 2019

Вы можете использовать ниже агрегации

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", []] }
        }
      }
    }
  }}
])
...