2014-12-03 72 views
0

我想更改我的數據庫的模式。現在它是這樣的:如何使用具有高度動態模式的Mongoose MongoDB

{ 
    "disp":[ 
     { 
      "quantity":1, 
      "date":20141109 
     }, 
     { 
      "quantity":1, 
      "date":20141110 
     }, 
     { 
      "quantity":1, 
      "date":20141111 
     } 
    ] 
} 

「日期」是唯一和索引。 像這樣的模式對我來說有一個很大的缺點。我無法以原子方式更新多個日期的「數量」,所以我必須在我的應用程序中實施Two Phase Commits

我測試的替代模式,我覺得這人會滿足我的需求

{ 
    "disp":{ 
     "20141109": { 
      "quantity":1 
     }, 
     "20141110": { 
      "quantity":1 
     }, 
     "20141111": { 
      "quantity":1 
     } 
    } 
} 

這樣我可以原子一個以上的日期更新量,但我不知道如何與貓鼬的模式,因爲這種管理日期可以以高度動態的方式添加和刪除。 在集合中將會有很多文檔的數量爲不同日期指定 ex。一個文件可以只有幾個日期的數量,另一個文件可以有幾年的數量

是更好地添加/刪除字段迫使每個文件有一個日期字段(默認爲0數量)或是它最好將strict設置爲false? 有什麼缺點我不知道?

+0

您的第二個模式格式無效。數組只能保存文檔或值。你的意思是'disp:{...}'? – BatScream 2014-12-03 08:44:29

+0

@BatScream是的,我複製並粘貼沒有雙重檢查。感謝您指出 – Edo 2014-12-03 08:47:17

+2

如果您有第二種格式,則不能根據日期執行聚合操作。最好不要有任何動態變量,並且可能在查詢選擇器中用作鍵。 – BatScream 2014-12-03 08:51:05

回答

3

如果你想堅持的第二格式,那麼它最好使用Mixed Schema Typedisp領域:

var my_schema = new Schema({ disp: {} }); 

var my_schema = new Schema({ disp: Schema.Types.Mixed }); 

是最好添加/刪除字段強制每個文檔有一個 日期字段(默認爲0數量)?

這不是一個好主意,因爲您需要在模式中明確指定所有可能的日期。

還是將嚴格設置爲false會更好?

我不會建議這樣做,因爲它會影響整個架構,而不僅僅是dist字段。

有什麼缺點我不知道?

這裏有一些缺點,我可以看到:

  • 你會失去其在dist場架構的所有優點;
  • 無法在dist字段上創建索引;
  • 根據日期不同,您將無法執行aggregate operations(與BatScream相比)。

但這並不意味着你的想法不好。使用日期作爲鍵的優點可以克服所有缺點。