我需要开发一个新的webapp(带有MEAN堆栈)。我之前只开发了一对。
我需要存储设备(例如100k文档)。 每个设备的读数为+1百万。每次我访问读数列表时,我都必须过滤内容(按特定字段)并最多获得1k记录。
我不知道设计应该是什么样的,寻找最佳性能。
我有三个选择:
选项1,使用子文档:
var deviceSchema = new mongoose.Schema({
device_id: Number,
serialNumber: String,
readings:[{
timestamp: Date,
lat: Number,
long: Number,
otherfield1: String,
...
}]
},{ timestamps: true, strict: false });
注意:我只访问数据库一次;我访问了该设备,并且随身携带了所有读数,但文档处理起来很大。
选项2,单独的集合:
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和日期过滤读数,但每个文档都很小。
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 });
注意:我从未使用过这个选项。我不得不一直填充,我不知道这是否能提供最佳性能:
Device.
find(...).
populate({
path: 'readings',
match: { timestamp: { $gte: xxxx}},
select: 'lat long',
options: { limit: 1000 }
}).
exec()
三者中哪一个具有最佳性能?