Пн goose - Как мне go ограничить размер переданного массива? - PullRequest
1 голос
/ 12 июля 2020

Я использую NodeJS и Mon goose для записи некоторых конечных точек. Следующий код в настоящее время работает должным образом. Он возвращает массив результатов из моей базы данных, где каждый результат состоит из идентификатора и массива значений, который выглядит следующим образом:

**[ { _id: 'Kitchen', values: [ 60, 60, 60, 60, 54 ] },
  { _id: 'My Desk', values: [ 40, 40 ] },
  { _id: 'Server Room', values: [ 50, 50, 50 ] } ]**

В настоящее время я пытаюсь выяснить, как ограничить размер помещенного массива не более 30 новейших записей. Я считаю, что мне нужно каким-то образом использовать splice, но я вполне могу заставить это работать. Вот код, который я сейчас использую:

    router.get("/api/getsensordata/", function (req, res) {
  let sensorNames = req.query.sensornames.split(",");
  let device = SensorData.aggregate([
    {
      $match: { sensorName: { $in: sensorNames } },
    },
    {
      $group: {
        _id: "$sensorName",
        values: {
          $push: "$sensorValue",
        },
      },
    },
  ])
    .sort({ _id: "ascending" })
    .exec(function (err, results) {
      if (err) {
        res.send("an error has occured");
      } else {
        console.log(results);
        res.json(results);
      }
    });
});

Есть ли у кого-нибудь идеи о том, как go достичь этого?

1 Ответ

0 голосов
/ 13 июля 2020

оператор $ slice должен быть применен после группировки.

let device = SensorData.aggregate([
    {
      $match: { sensorName: { $in: sensorNames } },
    },
    {
      $group: {
        _id: "$sensorName",
        values: {
          $push: "$sensorValue",
        },
      },
    },
    {
      $project: { values: {$slice: ["$values", 30]}}
    }
  ])

Учитывая ограничения RAM на групповой оператор для больших наборов данных , я рекомендую ограничение количества сгруппированных документов. Вы должны заказать документы , прежде чем ограничивать сгруппированные документы.

 let device = SensorData.aggregate([
    {
      $match: { sensorName: { $in: sensorNames } },
    },
    {
      $limit: 30
    },
    {
      $group: {
        _id: "$sensorName",
        values: {
          $push: "$sensorValue",
        },
      },
    }
  ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...