MongoDB: элемент проекта присутствует внутри массива внутри массива внутри объекта - PullRequest
1 голос
/ 28 апреля 2020

У меня есть коллекция в пн go, и мне нужен только определенный элемент.

Структура документа выглядит примерно так:

{
  outerArray: [
    {
      innerArray: [
        {
          elem: val1
        },
        {
          elem: val2
        }
      ]
    },
    {
      innerArray: [
        {
          elem: val3
        },
        {
          elem: val1
        }
      ]
    }
  ]
}

Мне просто нужно значение elem из этой коллекции. Кроме того, получение уникальных значений также является плюсом, но не обязательным.

Желаемый результат:

{
  elem: [
    val1,
    val2,
    val3
  ]
}

Я пробовал с проекцией и агрегацией, но не смог добиться успеха. Я использую Пн go 3.4.6.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Использование агрегационного конвейера MongoDB :

db.collection.aggregate([
  /** Projecting only `elem` as you just need values of `elem` field which reduces size of doc for further stages */
  {
    $project: { _id: 0, elem: "$outerArray.innerArray.elem" }
  },
  /** Re-create `elem` array field with only unique values by iterating on initial array & pushing uniques */
  {
    $project: {
      elem: {
        $reduce: {
          input: "$elem",
          initialValue: [],
          in: { $setUnion: [ "$$value", "$$this" ] }
        }
      }
    }
  }
])

Тест: mongoplayground

0 голосов
/ 28 апреля 2020

Вам нужен конвейер агрегации .

Посмотрите на $ размотку , $ group и $ addToSet . Который я использовал для построения этого конвейера агрегации.

db.i.aggregate([{ $unwind: "$outerArray" }, { $unwind: "$outerArray.innerArray" }, { $group: { _id: "$_id", "elem":  { $addToSet: "$outerArray.innerArray.elem" } } } ])
...