MongoDB: получить документы по последнему значению элемента во вложенном массиве

Этот вопрос немного отличается от других, так как мне нужно получить все документы, а не только определенные поля.

Мне нужно отфильтровать документы (все документы, а не только определенные поля) в соответствии со значением последних элементов вложенного массива. (doc.array[i].innerArray[innerArray.length - 1].desiredField)

Документы выглядят так:

[
  {
    "_id": 0,
    "matches": [
      {
        "name": "match 1",
        "ids": [
          {
            "innerName": "1234"
          },
          {
            "innerName": "3"
          }
        ]
      }
    ]
  },
  {
    "_id": 1,
    "matches": [
      {
        "name": "match 5",
        "ids": [
          {
            "innerName": "123"
          },
          {
            "innerName": "1"
          }
        ]
      },
      {
        "name": "match 5",
        "ids": [
          {
            "innerName": "1"
          },
          {
            "innerName": "1234"
          },
          
        ]
      },
      
    ]
  }
]

Итак, если мы фильтруем в соответствии с innerName = '1234', это результат:

{
    "_id": 1,
    "matches": [
      {
        "name": "match 5",
        "ids": [
          {
            "innerName": "123"
          },
          {
            "innerName": "1"
          }
        ]
      },
      {
        "name": "match 5",
        "ids": [
          {
            "innerName": "1"
          },
          {
            "innerName": "1234"
          },
          
        ]
      }
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из вариантов:

db.collection.find({
  $expr: {
    $in: [
      "1234",
      {$reduce: {
          input: "$matches",
          initialValue: [],
          in: {$concatArrays: ["$$value", [{$last: "$$this.ids.innerName"}]]}
        }
      }
    ]
  }
})

Посмотрите, как это работает на примере детской площадки

Спасибо! Мне нужно прочитать документы, чтобы понять, что здесь происходит :) Мне нужно получить результаты по нескольким параметрам, например: «1234» ИЛИ «3», возможно ли это внутри $expr?

lightPT 20.11.2022 17:17

Получил это, используя оператор $or внутри $expr, еще раз спасибо!

lightPT 20.11.2022 17:20

Другой вариант:

db.collection.aggregate([
{
$match: {
  $expr: {
    $gt: [
      {
        $size: {
          $filter: {
            input: "$matches",
            cond: {
              $in: [
                {
                  $last: "$$this.ids.innerName"
                },
                [
                  "1234"
                ]
              ]
            }
          }
        }
      },
      0
    ]
  }
 }
}
])

Объяснение:

Соответствовать только документам, в которых размер массива > 0, для тех, у кого в последнем вложенном элементе массива есть «1234».

Детская площадка:

Спасибо! Это работает, но забыл упомянуть, что find больше подходит для моего варианта использования, поэтому я выберу ответ ниморда.

lightPT 20.11.2022 17:06

Это решение может работать и с find - например, это

nimrod serok 22.11.2022 12:41

Другие вопросы по теме