2013-08-01 59 views
1

我有一个项目(ta-daaa)范围 - 对我很敏感。MongoDB设计/重构

最开始只是一个简单的应用程序来跟踪校准工具(每个工具都有一个年度转动周期检查校准)已经变成了库存跟踪过。

所以我目前的模式有一些必需的领域和校准的嵌入式DOC:

{ 
    _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") 
} 

什么是允许在这个模式如果不要求这些条码/串行非标定工具的最佳方式工具?此外,他们不会有校准日期,所以我现在的表,其中列出了工具和最近校准日期也不会开心返回零校准......

回答

2

这是不可能的,你将需要重构自己的数据库模式。

MongoDB应该可以处理异构数据。这意味着并非同一集合中的所有文档都需要具有相同的字段。对于MongoDB而言,当一些文档包含有关校准信息的字段,甚至是子文档时,这些都没有问题。

当您有一个不应该返回没有校准信息的文档的查找查询时,您可以添加查找条件calibrations: { $exists: true },并且只返回校准字段存在的文档。但即使像find({"calibrations.cal_date_due":{$lt:ISODate()})这样的查询也不会在没有字段calibrations,因此也没有calibrations.cal_date_due的文档上窒息。它只是默默地跳过这些文件。

+3

您可能想看看使用稀疏索引,生活在文件和必须针对查询子集中的任何领域。请参阅http://docs.mongodb.org/manual/core/indexes/#sparse-indexes –

+0

!稀疏是有用的!更新链接: http://docs.mongodb.org/manual/core/index-sparse/ – kroe