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);
我想使用 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);