Возвращает элемент в поле массива mongodb с операторами конвейера

#mongodb #aggregation-framework

#mongodb #структура агрегации

Вопрос:

Сейчас я использую что-то похожее на приведенное ниже, и оно работает и захватывает то, что мне нужно:

     state: { 
        $filter: { 
            input: "$location.address_components",
            as: "address_comp",
            cond: { $in: ["administrative_area_level_1", "$address_comp.types"]}
        }
    },
 

В моем случае использования это не всегда гарантировано. В этом случае я делаю то же самое для country и postal с различными проверками равенства для условия. Однако у меня осталось state поле в моем возвращенном документе, представляющее собой массив максимального размера 1 с объектом внутри.

В идеале я хотел бы, чтобы это поле было просто самим объектом, а не массивом с указанным объектом, возвращаемым filter оператором.

Ответ №1:

Трудно догадаться, как выглядит весь ваш конвейер агрегации, но я предполагаю, что ваш заключительный этап дает что-то вроде:

 [
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "key1": "value1",
    "state": [
      {
        "somekey": "dssdd"
      }
    ]
  }
]
 

В этом случае вам просто понадобится $unwind state путь. Итак, опять же, я предполагаю, что ваш последний этап — это $project :

     {
        "$project": { 
            ...
            ...
            state: { 
                $filter: { 
                    input: "$location.address_components",
                    as: "address_comp",
                    cond: { $in: ["administrative_area_level_1", "$address_comp.types"]}
                }
            }
        }
    },
    {
        "$unwind": "$state"
    }
 

Результатом будет:

 [
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "key": 1,
    "state": {
      "somekey": "dssdd"
    }
  }
]