2016-09-05 52 views
0

我想使用MongoDB測試實時數據系列的性能,但是在更新文檔時遇到了一些麻煩。文檔C中的MongoDB自動遞增密鑰#

我想是這樣的結構如下:

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

的事情是,我似乎無法更新「值」 BsonDocument相應地,因爲這兩個鍵和值是整數。我已經嘗試過公司,但沒有運氣。

任何幫助,將不勝感激!謝謝。

+0

這是有點不清楚,我看到一個datetimestamp在「時間戳」和值。值是否增加(每分鐘)它只是一個值數組? – HoefMeistert

+0

值每15分鐘遞增一次,這就是我想要達到的結構 –

回答

1

我看到你想要做的,閱讀你評論後更新。 有多種做法:)

從你在評論中提到的博客,你要做的是創建一個數組大小爲60(每秒)的單個文檔,這樣你可以用以下方式更新文檔:

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

其中0.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。您始終可以將平均值分組並將其放入其他集合中。爲此,您可以使用$out operator的聚合框架。例如,按照每小時每類型的值或類似的東西,不管什麼都適合你的需求;-)。

+0

我實際上是從MongoDB博客獲得的,所以我猜它應該是可行的:/ http://blog.mongodb.org/post/65517193370/schema-design -for-time-series-data-in-mongodb –

+0

謝謝你的迴應。當我使用csharp時,我無法使用builder訪問值爲value.x的位置x。你有什麼想法,我怎麼能做到這一點?現在我有這個: var update = Builders .Update.Set(e => e.values。,this.getRandomMetric()); collection.FindOneAndUpdate(過濾器,更新,新的FindOneAndUpdateOptions {IsUpsert = true}); 但我不能像這樣訪問BsonDocument位置。 –

+0

我找到了,參考上面的答案,謝謝 –

0

所以我想通了,不知道它是否是最好的方法,但它的工作原理。希望它也能幫助別人。

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