【发布时间】:2020-07-21 03:24:21
【问题描述】:
我一直在从事一个小型项目,该项目从传感器获取 MQTT 数据并将其存储在 MongoDB 数据库中。我正在使用 nodeJS 和猫鼬。这些是我的架构。
export const SensorSchema = new mongoose.Schema({
name: { type: String, required: true, unique: true },
location: { type: String, required: true },
type: { type: String, required: true },
unit: { type: String, required: true },
measurements: { type: [MeasurementSchema] }
},
{
toObject: { virtuals: true },
toJSON: { virtuals: true }
});
export const MeasurementSchema = new mongoose.Schema({
value: {type: Number, required: true},
time: {type: Date, required: true}
});
首先,我编写了一个函数,用于检索在两个时间戳之间进行的所有测量。
const values = Sensor.aggregate([
{ $match: Sensor.getValuesFromPath(sensorPath) },
{ $unwind: "$measurements"},
{ $match: { "measurements.time": { $gte: startTime, $lte: endTime} }},
{ $replaceRoot: { newRoot: "$measurements" } },
{ $project: { _id: 0}},
{ $sort: {time: 1}}
]).exec();
为了在 UI 中绘制图表,我需要以某种方式排序然后限制发送到客户端的数据。我想在某个间隔内发送每个 Nth Value,以确保数据有点类似于数据的过程。 我更喜欢不从数据库中获取所有数据的解决方案。
我将如何在数据库上执行此操作?我可以在排序后以某种方式访问元素的位置索引吗? $arrayElemAt 或 $elemMatch 是解决方案吗?
【问题讨论】:
标签: node.js mongodb typescript mongoose aggregation-framework