DBでフィールドに含まれる個別の値の数を計算するクエリはありますか?
fe国のフィールドがあり、国の値には8種類あります(スペイン、イギリス、フランスなど)。
誰かが新しい国のドキュメントをさらに追加した場合、クエリは9を返します。
グループ化してカウントするより簡単な方法はありますか?
DBでフィールドに含まれる個別の値の数を計算するクエリはありますか?
fe国のフィールドがあり、国の値には8種類あります(スペイン、イギリス、フランスなど)。
誰かが新しい国のドキュメントをさらに追加した場合、クエリは9を返します。
グループ化してカウントするより簡単な方法はありますか?
回答:
MongoDBには distinct
フィールドの個別の値の配列を返すコマンドがあります。配列の長さをカウントで確認できます。
シェルdb.collection.distinct()
ヘルパーもあります。
> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]
> db.countries.distinct('country').length
4
集約APIの使用例です。ケースを複雑にするために、ドキュメントの配列プロパティから大文字と小文字を区別しない単語でグループ化しています。
db.articles.aggregate([
{
$match: {
keywords: { $not: {$size: 0} }
}
},
{ $unwind: "$keywords" },
{
$group: {
_id: {$toLower: '$keywords'},
count: { $sum: 1 }
}
},
{
$match: {
count: { $gte: 2 }
}
},
{ $sort : { count : -1} },
{ $limit : 100 }
]);
そのような結果を与える
{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }
unwind
は、コードが配列フィールドの個々の値をグループ化するために必要distinct
です。
unwind
は配列を操作するときに必要です。
MongoDb 3.4.4以降では、$arrayToObject
演算子と$replaceRoot
パイプラインの使用を活用してカウントを取得できます。
たとえば、さまざまな役割を持つユーザーのコレクションがあり、役割の個別の数を計算するとします。次の集計パイプラインを実行する必要があります。
db.users.aggregate([
{ "$group": {
"_id": { "$toLower": "$role" },
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": null,
"counts": {
"$push": { "k": "$_id", "v": "$count" }
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
出力例
{
"user" : 67,
"superuser" : 5,
"admin" : 4,
"moderator" : 12
}
.distinct()
。
Mongo Shell Extensionsを活用できます。$HOME/.mongorc.js
Node.js / io.jsでコーディングしている場合は、に追加したり、プログラムで追加したりできる単一の.jsインポートです。
サンプル
フィールドの個別の値ごとに、オプションでクエリでフィルタリングされたドキュメント内の出現回数をカウントします
>
db.users.distinctAndCount('name', {name: /^a/i})
{
"Abagail": 1,
"Abbey": 3,
"Abbie": 1,
...
}
フィールドパラメータはフィールドの配列にすることができます
>
db.users.distinctAndCount(['name','job'], {name: /^a/i})
{
"Austin,Educator" : 1,
"Aurelia,Educator" : 1,
"Augustine,Carpenter" : 1,
...
}
require("./script.js")
、私は思います
.mongorc.js
ます。基本的には、ファイルをホームディレクトリに置きます。できました。