1

Mongoコンソールからうまく機能するこのMongoDB group-byクエリがあります:

db.accounts.group(
   { cond: { "created_at" : { $gte: ISODate("2012-08-12T00:00:00Z") }}
   , key: {member_id: true}
   , initial: {count: 0, failed: 0, succeeded: 0}
   , reduce: function(doc, out) { 
        out.count++; 
        if (!doc.success)
            out.failed++
        else
            out.succeeded++
    }
   });

私の3つの質問:

  • このタイムスタンプを生成する簡単な方法はありますか: ISODate("2012-08-12T00:00:00Z")? 日付関数を使用してこのタイムスタンプを生成できますか? もしそうなら、どのように?
  • 返された結果をグループ化されたフィールド (「失敗」または「成功」) でソート (昇順/降順) するにはどうすればよいですか?
  • 最後に、出力をフラット ファイルにエクスポートするにはどうすればよいでしょうか。

アップデート

#3については、基本的にこれを探していました:

mongo my_db --eval 'some_var=X;' --quiet my_script.js >> output.txt

my_db は使用しているデータベースです。some_var は、group-by クエリを含む my_script.js に渡す変数です。output.txt は明らかに出力が書き込まれる場所です。

4

1 に答える 1

0
  1. この日付表記をサポートする JSDateオブジェクト ( http://www.w3schools.com/js/js_obj_date.asp ) を使用できますが、通常はこれが日付を作成する最良の方法であり、ISO 日付の方が常に優れています。そのため、Mongo はDatev1.6 または 8 で通常のオブジェクトからこれらに変更されました (今は思い出せません:\)。

  2. group は単一の BSON ドキュメントを返すため (つまり、結果が 16 メガバイトを超えることはありません)、クライアント側で並べ替える必要があります。訂正: 受け取ったクエリは単一のオブジェクトであるため、ソートできません。したがって、これはクライアント側の問題です。MR を使用している場合は、それが可能ですが (私は推測します)。

  3. 返された構造をフラット ファイルに書き込むだけです。それは単一のドキュメントです。結果をフラットファイルにフォーマットする方法や、処理する言語はわかりませんが、通常は、(たとえば) PHP からグループコマンドを起動して作業しますそこに。これらの種類の言語では簡単です。

注: Group() はシャーディングでは機能しません。また、集約フレームワーク ( http://docs.mongodb.org/manual/applications/aggregation/ ) がこれをほぼ置き換えると思います。

于 2012-08-15T20:13:49.403 に答える