首页 > 解决方案 > Mongoose - 我将如何限制推送数组的大小?

问题描述

我正在使用 NodeJS 和 Mongoose 编写一些端点。以下代码当前按预期工作。它从我的数据库返回一个结果数组,其中每个结果由 ID 和一个值数组组成,如下所示:

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

我目前正在尝试弄清楚如何将推送数组的大小限制为最多 30 条最新记录。我相信我需要以某种方式使用拼接,但我可以让它发挥作用。这是我目前正在使用的代码:

    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);
      }
    });
});

有人对我如何实现这一目标有任何想法吗?

标签: node.jsmongodbmongoose

解决方案


$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",
        },
      },
    }
  ])

推荐阅读