2013-08-01 94 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