【问题标题】:Mongo - most efficient way to $inc values in this schemaMongo - 此模式中 $inc 值的最有效方法
【发布时间】:2011-09-25 19:37:55
【问题描述】:

我是 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 时遇到了困难。当我指定它应该更新插入时,它会尝试将整个文档作为条件匹配,并且在重复键上失败。同样对于 $addToSet - 如果我使用 { Key:"SomeStat1" } addToSet,它不会认为它是重复的,因为它与整个文档匹配,因此将它与现有的 SomeStat1 值一起插入。

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

提前致谢。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您使用了错误的架构,不可能对其进行原子更新。这样做:

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

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

    【讨论】:

    • 我不相信这是有效的 json?
    • 我在主文档中嵌入的问题是我认为不可能反序列化为强类型类(c# 驱动程序)。
    • 抱歉,正在修复它。我不认为您总是必须使用 c# 驱动程序反序列化,肯定有解决方法。
    • 或许可以解决反序列化问题,但并不理想。我不确定为什么我的原始模式应该被认为是“坏的”。如果我以后想记录一些额外的东西(比如“AvgDuration”)以及“Value”怎么办?在修改后的架构中这是不可能的,所以我仍然渴望找到我原来查询的答案......
    • 当然有可能,mongodb 完全没有模式。您的架构很糟糕,因为您无法进行原子更新..这还不够吗? :)
    【解决方案2】:

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

    【讨论】:

    • "嵌套数组在 mongo 中不是一个得到很好支持的结构,并且将它用于字典持久性是非常有限的。我们失去了自动搜索、索引和更新的能力。" - thx,这只是证明了我的观点.. 该架构不适合原子更新。该数组也没有任何意义,对于这种存储,您确实需要字典。 C#驱动真的那么差吗? python、ruby 和 php 驱动程序都允许存储和检索任意数据。
    • 最新的 C# 驱动程序有一个新的DictionarySerializationOptions 选项来解决这个问题。
    • 感谢@Hightechrider 的这些参考。
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2018-08-12
    • 2020-10-18
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多