2013-02-12 108 views
1

我有兩個MongoDB的集合多個文檔更新MongoDB的卡斯巴斯卡拉

促銷採集:

{ 
    "_id" : ObjectId("5115bedc195dcf55d8740f1e"), 
    "curr" : "USD", 
    "desc" : "durable bags.", 
    "endDt" : "2012-08-29T16:04:34-04:00", 
    origPrice" : 1050.99, 
    "qtTotal" : 50, 
    "qtClaimd" : 30, 
} 

聲稱集合:

{ 
    "_id" : ObjectId("5117c749195d62a666171968"), 
    "proId" : ObjectId("5115bedc195dcf55d8740f1e"), 
    "claimT" : ISODate("2013-02-10T16:14:01.921Z") 

} 

每當有人聲稱促銷,新文件將被創建其中proId是第一個(促銷)收藏的(虛擬)外鍵。每個聲明都應增加「促銷」集合中的「qtClaimd」計數器。以事務性方式增加另一個集合中的值的最佳方式是什麼?我知道MongoDB沒有隔離多個文檔。

另外,之所以我去「非嵌入式」的做法是遵循

宣傳片被創建併發布到用戶,那麼索賠將數千數百金額發生。考慮到寫入次數會在單個文檔中發生,因此我認爲在宣傳集合中嵌入聲明是不合邏輯的('因爲數以千計的聲明導致大小增加時,會調整大小的促銷集合')。採用非嵌入式方法可以使促銷收藏不受影響,但可以在「索賠」集合中插入新文檔。稍後在生成報告時,我將不得不顯示「促銷」細節以及該促銷的「聲明」細節。使用非嵌入式方法,我必須首先查詢「promo」集合,然後使用「proId」來「索取」集合。 * 另外值得一提的是,可能有幾次「索賠」可能同時發生在同一個「促銷」*

用這兩個集合實現事務處理效果的最佳方法是什麼?我使用Scala 2.10版本的Scala,Casbah和Salat。

回答

1
db.bar.update({ id: 1 }, { $inc: { 'some.counter': 1 } }); 

只要看看如何使用SalatDAO運行這個,我不是一個遊戲用戶,所以我不希望向您提供有關錯誤的建議。 $inc是Mongo增加的方式。