MongoDB设计/重构

MongoDB设计/重构,mongodb,refactoring,Mongodb,Refactoring,我有一个项目,这个项目的范围逐渐扩大 最初是一个跟踪校准工具的简单应用程序(每个工具都有一个年度轮换周期来检查校准),现在也变成了库存跟踪 因此,我当前的模型有一些必填字段和嵌入式校准文档: { _id: ObjectId("51b0d94c3f72fb89c9000014"), barcode: "H-131887", calibrations: [ { _id: ObjectId("51b0d94c3f72fb89c9000015"), cal_d

我有一个项目,这个项目的范围逐渐扩大

最初是一个跟踪校准工具的简单应用程序(每个工具都有一个年度轮换周期来检查校准),现在也变成了库存跟踪

因此,我当前的模型有一些必填字段和嵌入式校准文档:

{
  _id: ObjectId("51b0d94c3f72fb89c9000014"),
  barcode: "H-131887",
  calibrations: [
    {
      _id: ObjectId("51b0d94c3f72fb89c9000015"),
      cal_date: ISODate("2013-07-03T16:04:57.893Z"),
      cal_date_due: ISODate("2013-07-03T16:04:57.894Z"),
      ats_in: ISODate("2013-06-01T16:04:57.895Z"),
      ats_out: ISODate("2013-06-06T16:04:57.897Z")
    },
    {
      _id: ObjectId("51b0e6053f72fbb27900001b"),
      cal_date: ISODate("2013-06-13T00:00:00Z"),
      cal_date_due: ISODate("2014-06-13T00:00:00Z"),
      ats_in: ISODate("2013-06-06T00:00:00Z"),
      ats_out: ISODate("2013-06-17T00:00:00Z"),
      updated_at: ISODate("2013-07-09T14:44:31.113Z"),
      created_at: ISODate("2013-06-06T19:41:57.770Z")
    }
  ],
  created_at: ISODate("2013-06-06T18:47:40.481Z"),
  creator_id: ObjectId("5170547c791e4b1a16000001"),
  description: "",
  group: "engine",
  location: "Cabinet 1",
  maker: "MITUTOYO",
  model: "2046S",
  serial: "QEL228",
  status: "In",
  tool: "Dial Indicator",
  updated_at: ISODate("2013-07-09T14:44:31.103Z")
}

如果这些工具不需要条形码/序列号,那么在此模式中允许使用非校准工具的最佳方式是什么?此外,它们没有校准日期,因此我当前列出工具和最新校准日期的表不会乐意返回零校准…

您不太可能需要重构数据库架构

MongoDB应该使用异构数据。这意味着并非同一集合中的所有文档都需要具有相同的字段。对于MongoDB来说,当一些文档有字段甚至子文档关于校准信息,而有些文档没有字段甚至子文档时,这一点都没有问题


当您有一个不应该返回没有校准信息的文档的查找查询时,您只需添加查找条件
calibrations:{$exists:true}
,并仅返回那些存在校准字段的文档。但即使是像
find({“calibrations.cal_date_due”:{$lt:ISODate()})这样的查询
不会阻塞没有字段
校准的文档,因此也不会阻塞
校准。cal\u date\u due
也不会阻塞。它只会默默地跳过这些文档。

您可能希望查看对文档子集中的任何字段使用稀疏索引,这些字段需要进行查询。请参阅非常有用!正在更新链接: