MongoDB-嵌套用于单个嵌入式doc的每月/每年架构数据结构?

时间:2016-01-17 21:56:44

标签: node.js mongodb mongoose database-schema denormalization

使用MongoDb和Mongoose,

我想创建一个跟踪房间温度的网络应用。可以在一天中的任何时间输入临时值...例如,像每小时一次(我可以限制前端的阵列增长)。我将有一个图表,用户可以按天,周,月或年显示....所以明智的,那些将是查询。

使用MongoDb,我有这个架构:

var weeklySchema = new Schema({
  _user: { type: Number, ref: 'User' },
  _id: ObjectId(),
  room: String,
  updated_at: Date,
  sun: [ { _id: ObjectId(), value: Number } ], //ObjectId() would be the time stamp of value
  mon: [ { _id: ObjectId(), value: Number } ],
  tues: [ { _id: ObjectId(), value: Number } ],
  wed: [ { _id: ObjectId(), value: Number } ],
  thur: [ { _id: ObjectId(), value: Number } ],
  fri: [ { _id: ObjectId(), value: Number } ],
  sat: [ { _id: ObjectId(), value: Number } ]
});

我想利用MongoDb嵌入式文档并将更多信息放在一个文档中,所以我在考虑而不是每月一次。但我读到了如果数据结构变为嵌套或树结构,MongoDb不会查询/读/写的地方。

如果我每月,甚至是一年一次的单个文档,数据结构是否会嵌套,我会失去单个嵌入式文档的性能/优化优势?如果没有,我怎么能像上面那样按月或按年结构呢?

1 个答案:

答案 0 :(得分:0)

将您的架构设计为Date Aggregation Operations

var dailySchema = new Schema({
  _user: { type: Number, ref: 'User' },
  _id: ObjectId(),
  room: String,
  updated_at: Date,
});

var Daily = mongoose.model('Daily', dailySchema);

然后您可以操作update_at

Daily.aggregate({ $project: { day: { $dayOfMonth: "$updated_at" } } });

还可以检索每周,每月和每年的数据。这是一个讨论here