Mongodb проекция объекта из массива в массиве - вложенный массив - PullRequest
0 голосов
/ 23 октября 2019

Ниже моя environment структура данных

"environments" : [
        {
            "environmentId" : "375daa2e-d7e1-42ef-b40a-83e50f1ffa32",
            "environmentName" : "Urban",
            "environmentType" : "green",
            "services" : [
                {
                    "serviceId" : "78a2ec19-6b71-447b-9f0d-8978204274af",
                    "serviceName" : "railways",
                    "serviceType" : "transport"
                },
                {
                    "serviceId" : "5dddddddd-6b71-447b-9f0d-8978204274af",
                    "serviceName" : "Doctor",
                    "serviceType" : "people"
                },
                {
                    "serviceId" : "4ddddddd-6b71-447b-9f0d-8978204274af",
                    "serviceName" : "Bus",
                    "serviceType" : "transport"
                }

            ]
        }
    ]

Я запрашиваю запрос, используя serviceId и пытаюсь получить только соответствующий service элемент

db.mydatabase.find( {'environments.services' : { $elemMatch: { 'serviceId': "78a2ec19-6b71-447b-9f0d-8978204274af" }}},{'environments.services.$': 1} ).pretty()

Но этовозвращает мне все services в пределах этого environment .. но я хочу только это соответствие service

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Я смог сделать это с помощью операции $unwind

db.myDatabase.aggregate({$unwind:'$environments'}, {$unwind:'$environments.services'}, {$match:{ 'environments.services.serviceId':"e8a3192f-ab2f-4b9a-b7ab-5d7c5c68153e"}},{$project: {'services':'$environments.services'}}).pretty();
0 голосов
/ 23 октября 2019

Попробуйте этот запрос

 db.tester.aggregate(
 { "$match": {
    "environments": {
      "$elemMatch": {
         "services": {
           "$elemMatch": {
             "serviceId": "78a2ec19-6b71-447b-9f0d-8978204274af"
           }
         }
       }
    }
  }},
    { "$addFields": {
        "environments": {
          "$filter": {
            "input": {
              "$map": {
                "input": "$environments",
                "as": "sa",
                "in": {
                  "environmentId": "$$sa.environmentId",
                  "environmentName": "$$sa.environmentName",
                  "environmentType": "$$sa.environmentType",
                  "services": {
                    "$filter": {
                      "input": "$$sa.services",
                      "as": "sn",
                      "cond": {
                        "$and": [
                          { "$eq": [ "$$sn.serviceId", "78a2ec19-6b71-447b-9f0d-8978204274af" ] },
                        ]
                      }
                    }
                  }             
                }
              },
            },
            "as": "sa",
            "cond": {
            }
          }
        }
      }}
    ).projection({})
       .sort({_id:-1})
       .limit(100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...