Добавить поле элемента массива в агрегации MongoDB - PullRequest
3 голосов
/ 13 июня 2019

У меня есть коллекция документов, содержащая массив объектов:

db.collection.insert({
    arr: [
      { id: 1, text: 'foo' },
      { id: 2, text: 'bar' },
    ]
});

Есть ли способ извлечь / спроектировать / добавить поле одного элемента в этом массиве?Например, поле text первого элемента массива.Я пробовал различные варианты $ addFields в MongoPlayground ,

db.collection.aggregate([
  {
      $addFields: { text1: '$arr.text' }
  }
]);

, но ничего не дало только одно поле text.В лучшем случае я получил оба с синтаксисом выше, но мне нужно только одно поле, чтобы использовать для него $ type, потому что кажется, что $type не может проверять элементы массива .

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете использовать $ let с $ arrayElemAt , чтобы определить временную переменную и затем сослаться на нее, чтобы получить text поле:

db.collection.aggregate([
    {
        $addFields: {
            text1: {
                $let: {
                    vars: {
                        first: {
                            $arrayElemAt: [ "$arr", 0 ]
                        }
                    },
                    in: "$$first.text"
                }
            }
        }
    }
])
1 голос
/ 13 июня 2019

Один из способов извлечь поле элемента массива - проецировать первый элемент, используя $arrayElemAt на этапе $project, а затем получить доступ к нужному полю, напримерtext, во второй $project сцене:

db.collection.aggregate([
  {
    $project: {
      elem1: {
        $arrayElemAt: ["$arr", 0]
      }
    }
  },
  {
    $project: {
      text1: "$elem1.text"
    }
  }
])

Mongo Playground .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...