2016-09-05 10 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を更新するように見えることができないということです。私はincを試しましたが運はありません。

助けていただけたら幸いです!ありがとう。

+0

少し不明ですが、私は "タイムスタンプ"と値でdatetimestampを参照してください。インクリメント(1分あたり)の値は単なる値の配列ですか? – HoefMeistert

+0

値は15分ごとにインクリメントされています。これは実現したい構造です –

答えて

1

私はあなたがしたいと思う、あなたがコメントを読んだ後に更新したいと思う。 いろいろなやり方があります:

あなたがコメントで言及したブログから、配列サイズが60(毎秒)の単一のドキュメントを作成すると、次のようにドキュメントを更新できます。

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

ここで、.59は更新したい秒です。これだけアップサートが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の集計フレームワークを使用することができます。たとえば、1時間あたりのタイプごとの値をグループ化するなど、必要に応じて値をグループ化します。

+0

実際にMongoDBのブログから取得しましたので、実行可能であるはずです:/ http://blog.mongodb.org/post/65517193370/schema-design -for-time-series-data-in-mongodb –

+0

ありがとうございました。私はcsharpを使用しているので、value.xでvalue.xの位置xにbuilderを使ってアクセスすることはできません。どのように私はそれを達成することができますか?今私はこれを持っています: 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); 
関連する問題