首页 文章

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

提问于
浏览
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时遇到困难 . 当我指定它应该upsert时,它会尝试将整个文档作为条件匹配,并且它在重复键上失败 . 类似地,对于$ addToSet - 如果我使用{Key:“SomeStat1”}添加toToSet,它将不会认为它是重复的,因为它与整个文档匹配,因此将其与现有的SomeStat1值一起插入 .

这里最好的方法是什么?有没有办法控制$ addToSet匹配的方式?或者我需要一个不同的架构?

提前致谢 .

2 回答

  • 0

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

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

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

  • 0

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

相关问题