ломтик mongodb - удалить последние n элементов - PullRequest
0 голосов
/ 05 апреля 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.find({},{ "_id": 0, "data": {'$slice': [-3, 3] }})

Я могу исключить последние 3 элемента, однако я не могу выбрать все остальные, потому что если skip отрицателен или | skip | больше, чем list.length, тогда он возвращает последние три элемента, как если бы пропустить == 0

Как выбрать все элементы, кроме последних 3?

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

[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 голос
/ 05 апреля 2020

При агрегировании MongoDb мы можем использовать оператор $ size для вычисления data длины:

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

MongoPlayground

Примечание: Если data может быть пустым, нам нужно добавить $max operator

{
  $max: [
    {
      $subtract: [
        { $size: "$data" },
        3
      ]
    },
    1
  ]
}
...