3

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

{
       "_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でクエリを実行することでこれを行うことができます...

4

2 に答える 2

11

標準のSQLDBMSでは、これは次のクエリで実行されます。

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

mongodbでは、これはgroup関数を使用して実行されますが、少し複雑です。

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

ここでは、キー「type」(したがって「true」)の値を返すようにdbに要求しています。各値について、指定されたreduce関数を使用して、見つかったレコードを集約します。ここでは、各レコードが表示される回数のカウントを更新しています。このクエリを実行すると、次のような結果が得られます。

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

]

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

関連するドキュメントはこちらです。

于 2010-11-28T18:49:09.927 に答える
1

個別に使用できます: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";
}

結果が頻度順に並べられているかどうかはわかりません。

于 2010-11-28T18:47:24.937 に答える