MongoDB slice - удалить последние n элементов из вложенных массивов - PullRequest
1 голос
/ 13 апреля 2020

Предположим, у меня есть следующий массив:

{
   data: [1, 0, 4, 0, 0, 4, 1, 3, 0, 1, 0, 2, 2, 0, 1, 1, 0, 2, 0, 4, 1, 1, 0, 1, 1, 0]
}

Если я хочу выбрать все элементы, кроме последних 3, я могу использовать предложенное решение здесь

db.collection.aggregate([
  {
    $project: {
      "_id": 0,
      "data": {
        "$slice": [ 
          "$data",
          0,
          {
            $subtract: [ { $size: "$data" }, 3 ]
          }
        ]
      }
    }
  }
])

Я могу получить желаемый результат:

[1, 0, 4, 0, 0, 4, 1, 3, 0, 1, 0, 2, 2, 0, 1, 1, 0, 2, 0, 4, 1, 1, 0]

Как я могу сделать то же самое для объединенных / вложенных массивов, таких как:

 {
       data: [[1, 0, 4, 0, 0, 4, 1], [1, 0, 4, 0, 1, 5, 3]]
 }

Чтобы выбрать все элементы, кроме последних 3 (каждого массива)?

Ожидаемый результат:

        {
           data: [[1, 0, 4, 0], [1, 0, 4, 0]]
        }

1 Ответ

2 голосов
/ 13 апреля 2020

Вы можете использовать $ map , чтобы перебирать массивы и делать то же самое:

db.collection.aggregate([
  {
    $addFields: {
      data: {
        $map: {
          input: "$data",
          in: {
            "$slice": [
              "$$this",
              0,
              {
                $subtract: [
                  {
                    $size: "$$this"
                  },
                  3
                ]
              }
            ]
          }
        }
      }
    }
  }
])

Тест: MongoDB-Playground

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