我有两个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")
}
每当有人申请促销时,都会在"claimedPro"集合内创建一个新文档,其中proId是第一个(促销)集合的(虚拟)外键。每个索赔都应在"promo"集合中增加一个计数器"qtClaimed"。以事务方式增加另一个集合中的值的最佳方式是什么?我知道MongoDB没有隔离多个文档。
此外,我选择"非嵌入式"方法的原因如下
宣传片被创建并发布给用户,然后索赔将以十万计的金额发生。考虑到单个文档中的写入次数,我认为在促销集合中嵌入声明是不合乎逻辑的("当成千上万的声明导致促销集合的规模增加时,z mongo会调整促销集合的大小")。采用非嵌入的方法可以使促销集合不受影响,但可以在"索赔"集合中插入新文档。稍后在生成报告时,我必须显示"促销"详细信息以及该促销的"索赔"详细信息。对于非嵌入式方法,我必须首先查询"promo"集合,然后用"proId"claims"集合*还值得一提的是,对于同一个"促销"*,有时可能会同时发生100次"索赔"。
用这两个系列达到摩擦效果的最佳方式是什么?我使用的是Scala、Casbah和Salat,它们都是Scala 2.10版本。
db.bar.update({ id: 1 }, { $inc: { 'some.counter': 1 } });
看看如何用SalatDAO运行这个,我不是游戏用户,所以我不想给你错误的建议。$inc
是Mongo的增量方式。