2012-02-29 213 views
6

我需要存儲一些基本上只是日期/整數鍵值對的數據,其中日期將始終是唯一的。MongoDB - 有可能通過關聯數組鍵來查詢嗎?

我希望能夠將它存儲就像一個關聯數組:

array(
    "2012-02-26" => 5, 
    "2012-02-27" => 2, 
    "2012-02-28" => 17, 
    "2012-02-29" => 4 
) 

,但我也需要能夠查詢的日期(即把一切在那裏日期> 2012-02-27 ),所以懷疑我需要使用模式更像是:

array(
    array("date"=>"2012-02-26", "value"=>5), 
    array("date"=>"2012-02-27", "value"=>2), 
    array("date"=>"2012-02-28", "value"=>17), 
    array("date"=>"2012-02-29", "value"=>4), 
) 

顯然,前者是更清潔和更簡潔,但我可以查詢它,我想要的方式,如果沒有其他可能更合適的模式?

+0

http://www.php.net/manual/en/mongo.queries.php – 2012-02-29 20:56:55

+0

我不會以這種格式存儲日期。使用時間();功能。這將使排序日期等更容易。 http://php.net/manual/en/function.time。php – 2012-02-29 20:59:24

回答

10

你已經描述了兩種方法,讓我分解它們。

方法#1 - 關聯數組

用於通過 「關聯數組」 查詢的關鍵工具是$exists運算符。 Here是運營商的詳細信息。

所以你絕對可以運行類似下面的查詢:

db.coll.find({ $exists: { 'field.2012-02-27' } }); 

根據您的描述您正在尋找不與$exists運營商配合地很好範圍查詢。 「關聯數組」版本也很難索引。

方法#2 - 對象的數組

這無疑具有更好的查詢功能:

db.coll.find({ 'field.date': { $gt: '2012-02-27' } }); 

它也可以被索引

db.coll.ensureIndex({ 'field.date': 1 }); 

然而,有一個與貿易關閉更新。如果你想增加一個特定日期的值,你必須使用這個笨重的位置操作符$。這適用於一系列對象,但對於進一步嵌套的任何事情都會失敗。

其他問題

一個與上述兩種方法的問題是數據的長期增長。當您擴大對象大小時,它將佔用磁盤和內存中的更多空間。如果您有一個具有兩年價值數據的對象,那麼需要將整個700個項目的陣列存儲在內存中供您更新今天的數據。這可能不是您具體數據的問題,但應該考慮。

同樣,MongoDB查詢總是返回頂級對象。同樣,如果您有700個項目的數組,您將爲每個匹配的文檔獲取所有項目。有許多方法可以過濾掉返回的字段,但它們不適用於「對象數組」。

+0

'如果你有一個具有兩年價值數據的對象,那麼需要在整個數組中有700個項目在內存中供你更新今天的數據 - 如果我使用'$ slice'去除子集數組和'$ push'來追加一個新項目到數組? – 2012-03-01 09:37:08

+0

因此,這適用於返回數據,但僅限於按日期順序推送。但是,在服務器端,即使只傳遞給它一部分,仍然需要將整個對象拉入內存。 – 2012-03-02 02:00:53

+0

哦,對了,我沒有意識到,我覺得它足夠聰明,只能刪除指定的子集。這對我目前的項目來說是一個破壞者,謝謝你阻止我在6個月內完成任務,然後意識到它! – 2012-03-02 08:38:16

相關問題