mongoose嵌套模型与子文档(按性能)

我需要开发一个新的webapp(带有MEAN堆栈)。 我以前只开发过一对。

我需要存储设备(如100K文件)。 每个设备将有+1百万的读数。 每次我访问的读数列表,我将不得不过滤内容(通过特定的领域),并得到像1Klogging最大。

我不知道devise应该是什么样子,寻找最佳的performance。

我有三个select:


Option1,使用子文档:

var deviceSchema = new mongoose.Schema({ device_id: Number, serialNumber: String, readings:[{ timestamp: Date, lat: Number, long: Number, otherfield1: String, ... }] },{ timestamps: true, strict: false }); 

注意:我只访问DB一次; 我访问这个设备,我已经阅读了所有的文档,但是这个文档将会很大。


Option2,独立collections:

 var deviceSchema = new mongoose.Schema({ device_id: Number, serialNumber: String },{ timestamps: true, strict: false }); var readingSchema = new mongoose.Schema({ device_id: Number, timestamp: Date, lat: Number, long: Number, otherfield1: String, ... },{ timestamps: true, strict: false }); 

注:我访问数据库两次; 一个拿到设备,再次获得读数。 例如,我将按deviceid和date过滤读数,但每个文档都很小。


Option3,嵌套文件:

 var deviceSchema = new mongoose.Schema({ device_id: Number, serialNumber: String, readings: [{ type: Schema.Types.ObjectId, ref: 'Reading' }] },{ timestamps: true, strict: false }); var readingSchema = new mongoose.Schema({ timestamp: Date, lat: Number, long: Number, otherfield1: String, ... },{ timestamps: true, strict: false }); 

注意:我从来没有使用这个选项。 我将不得不一直填充,我不知道这是否会提供最好的performance:

 Device. find(...). populate({ path: 'readings', match: { timestamp: { $gte: xxxx}}, select: 'lat long', options: { limit: 1000 } }). exec() 

哪三个有最好的performance?