MongoDBで配列内の少なくとも1つの要素が他に存在しないドキュメントを検索する方法
MongoDBで配列内の少なくとも1つの要素が他に存在しないドキュメントを検索する方法
MongoDBで「配列内の少なくとも1つの要素が特定の項目リストに含まれない」ドキュメントを検索したい場合は、find()メソッドと正規表現(ネガティブ先読み)を組み合わせることで実現できます。
この記事では、実際のコード例を使いながら手順を順番に解説します。
1. ドキュメントを含むコレクションを作成する
まず、insertOne()メソッドを使ってサンプルコレクションを作成しましょう。
> db.demo228.insertOne({"Subjects":["MongoDB","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3fa51f03d395bdc213473b")
}
> db.demo228.insertOne({"Subjects":["MongoDB","Java","MySQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3fa52c03d395bdc213473c")
}2. コレクション内のすべてのドキュメントを表示する
find()メソッドを使って、コレクション内のすべてのドキュメントを確認します。
> db.demo228.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3fa51f03d395bdc213473b"), "Subjects" : [ "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e3fa52c03d395bdc213473c"), "Subjects" : [ "MongoDB", "Java", "MySQL" ] }3. 配列内の少なくとも1つの要素が条件に合致しないドキュメントを検索する
以下のクエリでは、正規表現のネガティブ先読み /^(?!MongoDB|Java)/ を使用することで、「MongoDB」や「Java」以外の要素を少なくとも1つ含むドキュメントを検索しています。
> db.demo228.find({ "Subjects": /^(?!MongoDB|Java)/ });実行結果は次のとおりです。
{ "_id" : ObjectId("5e3fa52c03d395bdc213473c"), "Subjects" : [ "MongoDB", "Java", "MySQL" ] }クエリのポイント解説
正規表現 /^(?!MongoDB|Java)/ は、ネガティブ先読み(negative lookahead)と呼ばれるパターンです。MongoDBでは、この正規表現を配列フィールドに適用すると、配列内の各要素が順番に評価され、「MongoDB」または「Java」で始まらない要素が1つでも存在すれば、そのドキュメントがマッチします。
今回の例では、2番目のドキュメントには「MySQL」という別の要素が含まれているため検索結果に表示されます。一方、1番目のドキュメントは「MongoDB」と「Java」のみで構成されているため、条件に合致する要素が存在せず、結果から除外されます。
-
MongoDBで同じ配列要素に一致するドキュメントを検索する方法
MongoDBで$all演算子を使って配列要素の一致するドキュメントを取得するMongoDBで、特定の配列要素と同じ内容を持つドキュメントを検索するには、find()メソッドの中で$all演算子を使用します。$all演算子は、フィールドの値が配列であり、その配列が指定されたすべての要素を含んでいるドキュメントを選択します。さらに$size演算子を組み合わせることで、要素数まで一致するドキュメントを正確に絞り込むことが可能です。それでは、まずドキュメントを含むコレクションを作成しましょう。> db.demo543.insertOne({id:101, subject:["MySQ
-
MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)
MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind、$match、$project を組み合わせることで、目的のデータを効率的に抽出できます。コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。> db.demo744.insertOne( ... { ... studentInformation: ... [ ...