node.js - 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);
}
});
});
有人对我如何实现这一目标有任何想法吗?
解决方案
$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",
},
},
}
])
推荐阅读
- ffmpeg - 时钟时间的ffmpeg流快照
- apache-kafka - KafkaConnect sink 设置 kafka 消费者隔离级别
- java - 将 2 个排序列表与所有元素合并
- javascript - React js材料ui网格响应
- c# - 如何格式化不带逗号的整数数据源,然后在水晶报表的列前后加上星号?
- javascript - 如何在discord.js中的事件channelCreate上获取频道的创建者
- docker - Spark Docker Java 网关进程在发送其端口号之前退出
- css - cdk拖放图像不起作用
- amazon-web-services - 在 AWS prod 阶段删除 API Gateway 资源
- reactjs - 反应标签不显示图像