MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで複数のフィールドから複数の値を検索する方法($textと$searchの使い方)

MongoDBで複数のフィールドを対象に複数の値を検索したい場合、$text演算子と$search演算子を組み合わせて使用します。本記事では、実際にコレクションを作成しながら、具体的な手順をわかりやすく解説します。

1. 検索用コレクションの作成

まずは、サンプルとなるドキュメントを挿入してコレクションを作成しましょう。

> db.searchMultipleFieldsDemo.insertOne({"_id":100,"FirstSubject":"Java","SecondSubject":"MongoDB"});
{ "acknowledged" : true, "insertedId" : 100 }
> db.searchMultipleFieldsDemo.insertOne({"_id":101,"FirstSubject":"MongoDB","SecondSubject":"MySQL"});
{ "acknowledged" : true, "insertedId" : 101 }
> db.searchMultipleFieldsDemo.insertOne({"_id":102,"FirstSubject":"MySQL","SecondSubject":"Java"});
{ "acknowledged" : true, "insertedId" : 102 }

上記のコマンドでは、「FirstSubject」と「SecondSubject」という2つのフィールドを持つドキュメントを3件登録しています。

2. 登録したドキュメントの確認

find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。

> db.searchMultipleFieldsDemo.find().pretty();

実行すると、以下のような出力が得られます。

{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }

3. テキストインデックスの作成(重要)

$text演算子を使用する前に、検索対象のフィールドに対してテキストインデックスを作成しておく必要があります。インデックスがない状態で$textを実行するとエラーになるため注意してください。

> db.searchMultipleFieldsDemo.createIndex({"FirstSubject":"text","SecondSubject":"text"});

これで、両方のフィールドが全文検索の対象になりました。

4. $textと$searchによる複数値の検索

それでは、複数のフィールドから「Java」と「MongoDB」という複数の値を同時に検索してみましょう。

> db.searchMultipleFieldsDemo.find({"$text":{"$search":"Java MongoDB"}});

実行結果は以下の通りです。

{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }

検索結果のポイント

$searchにスペース区切りで複数のキーワードを指定すると、MongoDBはいずれかのキーワードを含むドキュメントすべてを返します(OR検索)。そのため、上記の例では以下の3件すべてが該当しています。

  • _id: 100 … FirstSubjectに「Java」、SecondSubjectに「MongoDB」を含む
  • _id: 101 … FirstSubjectに「MongoDB」を含む
  • _id: 102 … SecondSubjectに「Java」を含む

このように、$text$searchを活用すれば、フィールドをまたいだ柔軟な全文検索を簡単に実装できます。なお、完全一致ではなく部分一致や関連度スコアに基づく検索になる点も覚えておくとよいでしょう。

  1. MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法

    MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127

  2. MongoDBの$regex演算子で大文字と小文字を区別しない検索を行う方法(iオプション)

    MongoDBで大文字と小文字を区別せずに文字列検索を行いたい場合は、$regex演算子に「i」(case insensitive:大文字と小文字を区別しない)オプションを指定します。この記事では、実際にコレクションを作成し、「mongodb」という文字列を表記の違いにかかわらずすべて取得する方法を、サンプルコード付きで解説します。ドキュメントを含むコレクションの作成まず、insertOne()メソッドを使って、異なる表記(MySQL、MongoDB、mongodb、MONGODB)のドキュメントを持つコレクションを作成しましょう。> db.demo759.insertOne({Subj