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

时间:2017-11-02 10:24:38

标签: node.js mongodb mongoose

我需要开发一个新的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()

三者中哪一个具有最佳性能?

0 个答案:

没有答案