2011-09-25 36 views
1

我是Mongo新手,並試圖使此架構有效。

它旨在記錄事件,因爲它們發生在高流量網站上 - 只是增加某個動作發生的次數。

{ 
    _id: "20110924", 
    Vals:[ 
     { Key: "SomeStat1": Value: 1}, 
     { Key: "SomeStat2": Value: 2}, 
     { Key: "SomeStat3": Value: 3} 
    ] 
    } 
    , 
    { 
    _id: "20110925", 
    Vals:[ 
     { Key: "SomeStat1": Value: 3}, 
     { Key: "SomeStat8": Value: 13}, 
     { Key: "SomeStat134": Value: 63} 
    ] 
    }, etc. 

所以這裏的_id是日期,然後是不同統計數組的數組以及它們發生的次數。當天可能沒有統計數據,並且數據鍵可以是動態的。

我正在尋找最有效的方式來實現這些更新,避免競爭條件......所以理想情況下所有原子。

我試圖做$ inc卡住了。當我指定它應該插入時,它會嘗試將整個文檔作爲條件匹配,並且在重複鍵上失敗。同樣,對於$ addToSet - 如果我用{Key:「SomeStat1」}添加ToSet,它不會認爲它是重複的,因爲它與整個文檔匹配,因此將其與現有的SomeStat1值一起插入。

這裏最好的辦法是什麼?有沒有辦法控制$ addToSet如何匹配?或者我需要一個不同的模式?

在此先感謝。

回答

0

您正在使用錯誤的模式,因此無法對其執行原子更新。像這樣做:

{ 
    _id: "20110924", 
    Vals: { 
    SomeStat1: 1, 
    SomeStat2: 2, 
    SomeStat3: 3, 
    } 
} 

,或者你可以跳過Vals子文檔和主文檔中嵌入統計。

+0

我不相信這是有效的JSON? – Nik

+0

問題我在嵌入主文檔時遇到了反序列化爲強類型類(c#驅動程序),我認爲這是不可能的。 – Nik

+0

opp抱歉,修復它。我不認爲你總是需要用c#驅動程序進行反序列化,這肯定是一種解決方法。 –

0

看看this article,它解釋了使用MongoDB C#驅動程序序列化字典的問題。請參閱C#驅動程序中的this work item

+0

「嵌套數組在Mongo中不是一個很好的支持結構,並且它用於字典持久化是非常有限的,我們失去了自動搜索,索引和更新的能力。」 - thx,這只是證明我的觀點..該架構不適合原子更新。而且這個數組並沒有真正的意義,因爲這種存儲你真的需要一本字典。 C#驅動程序真的很糟糕嗎? python,ruby和php驅動程序都可以存儲和檢索任意數據。 –

+0

最新的C#驅動程序有一個新的'DictionarySerializationOptions'選項來解決這個問題。 –

+0

感謝那些參考@Hightechrider。 – Nik