MongoDBで配列のサイズを正確にカウントするクエリの書き方
MongoDBで重複を除いた要素の数(配列のサイズ)を取得したい場合には、distinct()メソッドで一意な要素を取り出し、その結果に対してlengthプロパティを使うことで簡単に実現できます。
db.yourCollectionName.distinct('yourFieldName').length;サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成してみましょう。ここでは学生の名前が重複して登録されているデータを用意します。
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304f5b64f4b851c3a13dc")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304fab64f4b851c3a13dd")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304fcb64f4b851c3a13de")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30500b64f4b851c3a13df")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30505b64f4b851c3a13e0")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3050ab64f4b851c3a13e1")
}登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.countOrSizeDemo.find();
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5cd304f5b64f4b851c3a13dc"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5cd304fab64f4b851c3a13dd"), "StudentFirstName" : "David" }
{ "_id" : ObjectId("5cd304fcb64f4b851c3a13de"), "StudentFirstName" : "David" }
{ "_id" : ObjectId("5cd30500b64f4b851c3a13df"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5cd30505b64f4b851c3a13e0"), "StudentFirstName" : "Sam" }
{ "_id" : ObjectId("5cd3050ab64f4b851c3a13e1"), "StudentFirstName" : "John" }全部で6件のドキュメントが登録されていますが、「David」と「John」がそれぞれ2件ずつ存在している点に注目してください。
配列(一意な要素)のサイズを取得するクエリ
それでは、distinct()メソッドとlengthを組み合わせて、重複を除いた要素数を取得してみましょう。
> db.countOrSizeDemo.distinct('StudentFirstName').length;このクエリを実行すると、次の出力が得られます。
4
結果の解説
ドキュメントの総数は6件ですが、出力された値は「4」です。これは、重複していた「David」と「John」がそれぞれ1件にまとめられたためです。つまり、一意な名前は「John」「David」「Carol」「Sam」の4種類ということになります。
このように、distinct().lengthを活用すれば、特定フィールドに含まれる重複なしの要素数をシンプルなクエリで手軽にカウントできます。集計パイプライン($groupなど)を使わずに済むため、手軽な確認作業に非常に便利です。
-
MongoDBの$groupと$sumを使ってドキュメント内の重複データの出現回数を取得する方法
MongoDBでグループ集計を行い、同じ値が何回出現しているか(重複回数)を取得したい場合は、集計パイプラインの $group 演算子と $sum 演算子を組み合わせるのが定番の手法です。1. サンプルコレクションの作成まず、動作確認用に「Marks(点数)」フィールドを持つドキュメントをいくつか挿入したコレクションを作成します。> db.demo676.insertOne({Marks:87}); { acknowledged : true, insertedId : ObjectId(5ea41eed04263e90dac943f2) } > db.demo67
-
MongoDBで配列の要素数をカウントし、新しいフィールドに表示する方法
ドキュメント内の配列要素の数をカウントするには、MongoDBの $size 演算子を使用します。$size は集計パイプライン(aggregate)の中で利用でき、指定した配列フィールドに含まれる要素の総数を数値として返します。ここでは、実際にコレクションを作成しながら、配列要素数をカウントして新しいフィールドに表示する手順を解説します。1. コレクションの作成まず、ドキュメントを挿入してコレクションを作成します。各ドキュメントには科目名を格納する配列フィールド「ListOfSubject」を持たせます。> db.demo703.insertOne({ListOfSubject:[My