agmission/Development/server/model/application_detail.js

68 lines
2.9 KiB
JavaScript

// Application-Detail: AppId, zoneName, latitude, longitude, spray(on/off), targetRate, AppRate, temperature, humidity, gpsdatetime
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
const schema = new Schema({
appId: { type: Schema.Types.ObjectId, ref: 'Application', required: false }, // TODO: to be removed later
fileId: { type: Schema.Types.ObjectId, ref: 'AppFile', required: true },
// Data from 3rd-byte-header 08/05 records
gpsTime: { type: Number, default: 0.0 },
lat: { type: Number, required: true },
lon: { type: Number, required: true },
tslu: { type: Number, default: 0 },
llnum: { type: Number, default: 0 },
xTrack: { type: Number, default: 0 },
grSpeed: { type: Number, default: 0 },
alt: { type: Number, default: 0 },
timeAdv: { type: Number, default: 0 },
utmX: { type: Number, default: 0 },
utmY: { type: Number, default: 0 },
swath: { type: Number, default: 0 },
noAC: { type: Number, default: 0 },
sprayStat: { type: Number, alias: 'spray', default: 0 },
head: { type: Number, default: 0 },
stdHdop: { type: Number, default: 0 },
satsIn: { type: Number, default: 0 },
lminApp: { type: Number, default: 0 },
lminReq: { type: Number, default: 0 },
lhaReq: { type: Number, default: 0 },
sens: { type: Number, default: 0 }, // Flow sensor or Flow controller type. i.e.: 107 is AgFlow
calcodeFreq: { type: Number, default: 0 },
// fmId: { type: Number, default: 0 },
sprayHeight: { type: Number, default: 0 },
windSpd: { type: Number, default: 0 },
windDir: { type: Number, default: 0 },
temp: { type: Number, default: 0 },
humid: { type: Number, default: 0 },
driftX: { type: Number, default: 0 },
driftY: { type: Number, default: 0 },
depositX: { type: Number, default: 0 },
depositY: { type: Number, default: 0 },
// Data from RPM 3rd-byte-header 06 records
applicRate: { type: Number, default: 0 },
rpm: { type: [Number] }, // For RPM values from granular FC
psi: { type: Number, default: 0 }, // Booms pressure (psi) when using a pressure sensor
gpsAlt: { type: Number, default: 0 },
radarAlt: { type: Number, default: 0 },
raserAlt: { type: Number, default: 0 },
weight: { type: Number, default: 0 } // Kg
// Note: createdDate removed - use _id.getTimestamp() for creation time
// Saves 8GB+ storage on billion+ documents and eliminates redundant index (14+GB on billion+ documents)
});
// Optimized indexes for billion+ document scale
// Primary index - covers 95% of queries: find by fileId, fileId $in operations
schema.index({ fileId: 1 }, { background: true });
// Note: Removed createdDate index since time-based queries use _id ranges
// Use createObjectIdFromDate() for time-based filtering by _id
// Note:
// The fileId index alone covers most queries efficiently
// For time-based queries, use _id ranges with ObjectId.createFromTime()
module.exports = mongoose.model('Application_Detail', schema);