我是一名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时遇到困难。当我指定它应该upsert时,它会尝试将整个文档作为条件匹配,并且它在重复键上失败。类似地,对于$ addToSet - 如果我使用{Key:“SomeStat1”}添加toToSet,它将不会认为它是重复的,因为它与整个文档匹配,因此将其与现有的SomeStat1值一起插入。
这里最好的方法是什么?有没有办法控制$ addToSet匹配的方式?或者我需要一个不同的架构?
提前致谢。
答案 0 :(得分:0)
您使用的是错误的架构,因此无法对其进行原子更新。这样做:
{
_id: "20110924",
Vals: {
SomeStat1: 1,
SomeStat2: 2,
SomeStat3: 3,
}
}
或者您可以跳过Vals
子文档并将统计信息嵌入主文档中。
答案 1 :(得分:0)
查看this article,它解释了使用MongoDB C#驱动程序序列化Dictionary的问题。另请参阅C#驱动程序上的this work item。