質問

MongoDBコレクションから「タイプ」フィールドから一意の値のリストを取得しようとしています。以下のドキュメントの例:

{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "research",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "memo",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "memo",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}
{
       "_id" : ...,
       "type" : "report",
       "tasks" : ...
}

私は、頻度で注文された、ドキュメントのタイプフィールドにある一意のタイプを探しています。

["report", "memo", "research"]

これを行うための最良の方法は何ですか?うまくいけば、私はMongoでクエリをして、コレクション全体をダウンロードしないことでこれを行うことができます...

役に立ちましたか?

解決

標準のSQL DBMSでは、これは次のクエリで行われます。

SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct;

Mongodbでは、これはグループ機能を使用して行われますが、少し複雑です。

db.collection.group(
           {key: { "type":true},
            reduce: function(obj,prev) { prev.count += 1; },
            initial: { count: 0 }
            });

ここでは、dbにキー「タイプ」(したがって「真」)の値を返すように依頼し、各値に対して、指定された還元関数を使用して、見つかったレコードを集約します。ここでは、各レコードが表示される回数のカウントを更新するだけです。このクエリを実行すると、次のようなものが得られます。

[
    {
        "type" : "report",
        "count" : 5
    },
    {
        "type" : "memo",
        "count" : 15
    }
    {
        "type" : "research",
        "count" : 3
    }

]

これは注文されていないことに気付くでしょう。 Mongodbドキュメントでさえ、それを注文する最も簡単な方法は、クライアント側を行うことです。

関連するドキュメントはです ここ.

他のヒント

あなたは明確なものを使用できます: http://www.mongodb.org/display/docs/aggregation#aggregation-distinct

PHPドキュメントには例があります: http://php.net/manual/en/mongodb.command.php

$types = $db->command(array("distinct" => "yourCollection", "key" => "type"));

foreach ($types['values'] as $type) {
    echo "$type\n";
}

結果が頻度で順序付けられるかどうかはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top