2016-02-01 60 views
0

我將一些數據存儲到mongo數據庫中,我不確定我必須使用的結構......它是關於物聯網傳感器在每個特定時間發送一個值(溫度,壓力等)的。我想在一個特定時間(我想過一個陣列),傳感器類型(如溫度)中存儲一個集合(集合名稱將是傳感器名稱)所有來自傳感器的值。MongoDB:陣列與否?

下面是一個例子:

{ 
    history : [ { date : "ISODate(2016-02-01T11:23:21.321Z)", value : 10.232216 }, { date : "ISODate(2016-02-01T11:26:41.314Z)", value : 10.164892 } ], 
    type : "temperature" 
} 

但我的問題是,我想查詢數據庫獲取歷史的文件「列表」。每一個與日期和價值。另一方面,我想在每次有新的歷史記錄時爲歷史添加新的值。

感謝

+0

如果您計劃在數組中存儲的值最終增長得非常大,您最好使用它自己的集合。 – dansasu11

回答

2

存放在收集讀數每讀,如:

{ 
    date : "ISODate(2016-02-01T11:23:21.321Z)", 
    value : 10.232216, 
    type : "temperature", 
    sensor-name: "sensor-1" 
} 

這樣你就可以訪問類型,日期,價值和傳感器讀數。沒有理由爲什麼您需要爲每個傳感器創建一個集合。

+0

我想你可以爲每個傳感器製作一個集合,但如果你正確地編制索引,它並不能真正做到更快。 –

+0

但是這樣,我將在每個文檔中存儲類型。這是不是有點冗餘和內存浪費? – Phoste

+0

物理存儲內存很便宜,時間不是。通常,當您構建數據庫結構時,您將始終優先考慮讀/寫時間優於內存。數據庫中索引的整個概念主要是利用內存空間來加快訪問時間。 –

0

如何將讀數分爲集合完全取決於您,無論是一個集合還是多個集合。雙方可能會有很好的爭論。

但是,關於陣列:請記住,傳感器讀數爲無界。也就是說,它們本質上可能是無限的 - 只是閱讀的流程。 MongoDB文檔的大小有限(目前爲16MB)。使用無限數組時,您最終會達到此限制,這會導致更新失敗,並要求您更改存儲體系結構以適應傳感器讀數。

因此,您需要設計一個分區解決方案來跨多個文檔分割數組數據(以避免文檔大小限制問題),或避免將數組和數據讀取存儲在單獨的文檔中。

+0

這是真的,多虧了提到它:) – Phoste

1

Ting Suns answer是絕對合適的:只需將每個測量讀數作爲單獨文檔存儲在集合中即可。如果您想爲每個傳感器安排一個單獨的集合,則這取決於您。儘管將它們全部放入同一個集合中似乎更加明顯。

特別是你不應該存儲項目 - 在你的案例測量讀數 - 其數量基本上無限增長或可能成爲「非常大」到另一個MongoDB文檔的嵌入數組。這是因爲:

此外,針對單個嵌入式項目/度量的查詢效率低下且難以實現,因爲實際上您必須查詢整個父級文檔。