MongoDB PHPフィールドを取得する一意の値
-
28-09-2019 - |
質問
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";
}
結果が頻度で順序付けられるかどうかはわかりません。
所属していません StackOverflow