0

MongoDB ブログのこの記事「MongoDBの時系列データのスキーマ設計」で、著者は複数の時系列値をベース タイムスタンプの番号付きの子として単一のドキュメントに格納することを提案しました (つまり、1 分あたりのドキュメント、値の配列としての秒)。

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

提案されたスキーマは良いもののように思えますが、最後のサンプルがいつ発生したかを知りたい場合に必要な「値」フィールド名を照会する方法について言及していません。

最新のメトリック (timestamp_minute と値の最も高いフィールド名を組み合わせたもの) の時間のようなものを見つけるためのクエリを作成するにはどうすればよいでしょうか?

本当にありがとう!

4

2 に答える 2

0

議事録のドキュメントをクエリしてから、クライアントでループを使用して、どのタイムスタンプが設定されているかを判断できます。

doc = c.find(...)
var last = 0
for (var i=0; i<60; i++)
    if (i in doc.values)
        last = i

もう少し効率的なもう 1 つの方法は、1 秒あたりのサンプルにドキュメントの代わりに配列を使用し、配列の長さを使用して、保存されている秒のサンプル数を決定することです。

doc = c.find(...)
last = doc.values.length - 1
于 2013-11-04T18:41:44.510 に答える
0

別のブログ投稿で「フィールド名を照会できますか」という答えを見つけました。これは、MapReduce関数alaでのみキーを反復処理することを示しています(ブルースが示唆するように):

  var d = 0;
  for (var key in this.values)
      d = Math.max(d, parseInt(key));

MMS の例のスキーマ (以下の v とラベル付けされた値の配列で、timestamp_minute と days を月で入れ替える) のデータと、最新のメトリック日付を生成するクエリを次に示します。

db.metricdata.find();

/* 0 */
{
    "_id" : ObjectId("5277e223be9974e8415f66f6"),
    "month" : ISODate("2013-10-01T04:00:00.000Z"),
    "type" : "ga-pv",
    "v" : {
        "10" : 57,
        "11" : 49,
        "12" : 91,
        "13" : 27,
      ...
    }
}

/* 1 */
{
    "_id" : ObjectId("5277e223be9974e8415f66f7"),
    "month" : ISODate("2013-11-01T04:00:00.000Z"),
    "type" : "ga-pv",
    "v" : {
        "1" : 145,
        "2" : 51,
        "3" : 63,
        "4" : 29
    }
}

そしてマップ縮小機能:

db.metricdata.mapReduce(
    function() {
        var y = this.month.getFullYear();
        var m = this.month.getMonth();
        var d = 0;

        // Here is where the field names used
        for (var key in this.v)
            d = Math.max(d, parseInt(key));

        emit(this._id, new Date(y,m,d));
    },
    function(key, val)
    {
        return null;
    },
    {out: "idandlastday"}
 ).find().sort({ value:-1}).limit(1)

これは次のようなものを生成します

/* 0 */
{
    "_id" : ObjectId("5277e223be9974e8415f66f7"),
    "value" : ISODate("2013-11-04T05:00:00.000Z")
}
于 2013-11-04T21:55:29.347 に答える