MongoDBで特定のフィールド値を持つドキュメントを含まない配列を持つドキュメントを検索する方法
MongoDBで$nin演算子を使って特定のフィールド値を含まない配列を持つドキュメントを検索する
MongoDBでは、配列内に特定のフィールド値を持つドキュメントが含まれていないドキュメントを検索したい場合、$nin演算子を使用します。この記事では、実際にコレクションを作成しながら、$nin演算子の使い方を具体例とともにわかりやすく解説します。
サンプルコレクションの作成
まず、動作を確認するためのコレクションを作成します。以下のクエリを実行して、学生の点数データを格納したドキュメントを挿入しましょう。
> db.documentWithAParticularFieldValueDemo.insertOne( ... { ... ... "StudentId" : 101, ... "StudentDetails" : ... [ ... { ... "TheoryMarks": 78, ... "PracticalMarks": 91 ... }, ... { ... "TheoryMarks": 75, ... "PracticalMarks": 75 ... } ... ] ... } ... );{ "acknowledged" : true, "insertedId" : ObjectId("5c8edab72f684a30fbdfd586")}> db.documentWithAParticularFieldValueDemo.insertOne( ... ... { "StudentId" : 102, ... "StudentDetails" : [ ... { ... "TheoryMarks": 91, ... "PracticalMarks": 91 ... }, ... { ... "TheoryMarks": 75, ... "PracticalMarks": 75 ... } ... ] ... } ... );{ "acknowledged" : true, "insertedId" : ObjectId("5c8edaf12f684a30fbdfd587")}このクエリでは、2件の学生ドキュメントを挿入しています。1件目(StudentId: 101)は理論点数「78」を含み、2件目(StudentId: 102)は含んでいません。この違いが後ほど重要になります。
挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.documentWithAParticularFieldValueDemo.find().pretty();
実行結果は以下の通りです。
{ "_id" : ObjectId("5c8edab72f684a30fbdfd586"), "StudentId" : 101, "StudentDetails" : [ { "TheoryMarks" : 78, "PracticalMarks" : 91 }, { "TheoryMarks" : 75, "PracticalMarks" : 75 } ]}{ "_id" : ObjectId("5c8edaf12f684a30fbdfd587"), "StudentId" : 102, "StudentDetails" : [ { "TheoryMarks" : 91, "PracticalMarks" : 91 }, { "TheoryMarks" : 75, "PracticalMarks" : 75 } ]}$nin演算子を使った検索クエリ
それでは本題です。配列内のドキュメントに特定のフィールド値(ここでは「TheoryMarks: 78」)が含まれていないドキュメントを検索するには、以下のようにクエリを記述します。
> db.documentWithAParticularFieldValueDemo.find({'StudentDetails.TheoryMarks': {$nin: [78]}}).pretty();実行結果は以下の通りです。
{ "_id" : ObjectId("5c8edaf12f684a30fbdfd587"), "StudentId" : 102, "StudentDetails" : [ { "TheoryMarks" : 91, "PracticalMarks" : 91 }, { "TheoryMarks" : 75, "PracticalMarks" : 75 } ]}結果の解説
ご覧のとおり、TheoryMarksが「78」のドキュメントを含むStudentId: 101のデータは除外され、含まないStudentId: 102のデータのみが返されました。
ポイントは、ドット記法(StudentDetails.TheoryMarks)でネストされた配列内のフィールドにアクセスし、$nin演算子で除外したい値の配列を指定している点です。$ninは「指定した配列内のいずれの値にも一致しない」という条件を表すため、配列要素の中に該当する値が1つでも存在するドキュメントは検索結果から除外されます。複数の値を除外したい場合は、{$nin: [78, 75]}のように配列に値を追加するだけで対応できます。
-
MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法
特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..
-
MongoDBで「13」で始まるフィールド値を持つドキュメント数をカウントする方法
はじめにMongoDBでコレクション内のドキュメント数を取得するには、count()メソッドを使用します。さらに、特定の文字列で始まるフィールド値を持つドキュメントを絞り込みたい場合は、$regex演算子が便利です。本記事では、「13」で始まる値を持つドキュメントをカウントする具体的な手順を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo570.insertOne({Information:{Value:"13675"}});{ "acknowledge