Mongo - 这种模式中$ inc值最有效的方法

时间:2011-09-25 19:37:56

标签: mongodb

我是一名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匹配的方式?或者我需要一个不同的架构?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您使用的是错误的架构,因此无法对其进行原子更新。这样做:

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

或者您可以跳过Vals子文档并将统计信息嵌入主文档中。

答案 1 :(得分:0)

查看this article,它解释了使用MongoDB C#驱动程序序列化Dictionary的问题。另请参阅C#驱动程序上的this work item