MongoDB C# 文档中的自增键

MongoDB auto-increment key in Document C#

我想使用 MongoDB 测试实时数据系列的性能,但我在更新文档时遇到了一些问题。

我想要类似下面的结构:

{
 timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
 type: "memory_used",
 values: {
   0: 999999,
   …  
   37: 1000000,
   38: 1500000,
   … 
   59: 2000000
 }
}

问题是我似乎无法相应地更新 "values" BsonDocument,因为键和值都是整数。我试过 inc 但没有成功。

如有任何帮助,我们将不胜感激!谢谢

我看到你想做什么,看完你的评论更新。 有多种方法:)

根据您在评论中提到的博客,您所做的是创建一个数组大小为 60(每秒)的单个文档,这样您就可以更新文档:

  db.metrics.update(
  { 
    timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
    type: ”memory_used”
  }, 
  {$set: {“values.59”: 2000000 } }
)

其中 .59 是您要更新的秒数。因此,当 upsert 设置为 true 时,只需每秒调用一次更新,第一次更新会创建文档

当使用您提到的 c# 时,您可以执行如下操作:

if (second==0){
//insert the "new" timestamped object into the collection
}
else{
var update = Builders<Metric>.Update.Set(e => e.values[second], this.getRandomMetric());
}

这应该会为您提供一个包含 59 个项目的值数组的文档。

但是对于报告来说,我认为这并不是一个真正的尝试,为什么不将它存储在一个文档中呢?

{
     timestamp_minute: ISODate("2013-10-10T23:06:01.000Z"),
     type: "memory_used",
     value: 999999
 },
 {   
     timestamp_minute: ISODate("2013-10-10T23:06:37.000Z"),
     type: "memory_used", 
     value: 1000000
  },
     timestamp_minute: ISODate("2013-10-10T23:06:59.000Z"),
     type: "memory_used",
     value: 2000000
  }

如果您对有限的历史感兴趣,只需将其放入 capped collection. You can always group the averages and put them in an other collection. For this you can use the aggregation framework with the $out operator。例如,将每小时每种类型的值或类似的值分组,只要符合您的需要即可;-)。

所以我想通了,不确定这是否是最好的方法,但它确实有效。希望它也能帮助别人。

var update = Builders<Metric>.Update.Set(e => e.values["0"], this.getRandomMetric()).Inc(e => e.numberOfRecords, 1);