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