MongoDBで特定の単語の部分文字列が配列に含まれるドキュメントを検索する方法
MongoDBで「特定の単語の部分文字列に一致する文字列が配列内に含まれている」ドキュメントを検索したい場合は、aggregate()を使用します。この記事では、サンプルコレクションを作成し、実際にクエリを実行して目的のドキュメントを取得するまでの手順を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使って、文字列の配列を持つドキュメントを含むコレクションを作成しましょう。
> db.demo90.insertOne(
... {"words": ["john", "jace"]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c1ada79799acab037af56")
}
> db.demo90.insertOne(
... {"words": ["sam", "adam"]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c1adb79799acab037af57")
}
登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo90.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e2c1ada79799acab037af56"), "words" : [ "john", "jace" ] }
{ "_id" : ObjectId("5e2c1adb79799acab037af57"), "words" : [ "sam", "adam" ] }
部分文字列を含むドキュメントを検索するクエリ
続いて、特定の単語(ここでは「john」)の部分文字列となる文字列がwords配列に含まれているドキュメントを検索するクエリを見てみましょう。
> db.demo90.aggregate([ { $match: { $expr: { $anyElementTrue: { $map: { input: "$words", as: "j", in: { $ne: [ -1, { $indexOfBytes: [ "john", "$$j" ] } ] } } } } } } ]);
このクエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e2c1ada79799acab037af56"), "words" : [ "john", "jace" ] }
クエリの仕組み
このクエリは、複数の集計演算子を組み合わせることで実現されています。それぞれの役割は以下のとおりです。
- $match + $expr: 集計パイプライン内で式ベースの条件判定を行い、条件に合うドキュメントだけを抽出します。
- $map:
words配列の各要素を変数$$jとして順番に処理します。 - $indexOfBytes: 検索対象の単語「john」の中に各要素(
$$j)が出現する位置を返します。見つからない場合は-1を返します。 - $ne: 戻り値が
-1以外であればtrue、つまりその要素が「john」の部分文字列であると判断します。 - $anyElementTrue: 配列内の要素が1つでも
trueであれば、全体としてtrueを返します。
つまり、配列内のいずれかの要素が「john」という単語の部分文字列として含まれていれば、そのドキュメントは検索結果としてマッチします。上記の例では、最初のドキュメントの配列に「john」自体が含まれているため、該当ドキュメントとして出力されたというわけです。検索対象の単語を変更すれば、任意のキーワードに対して同じロジックを再利用できます。
-
MongoDBで特定の文字列を含むドキュメントを検索する方法($regexの使い方)
MongoDBで特定の文字列を含むドキュメントを見つける方法MongoDBで特定の文字列が含まれるドキュメントを検索したい場合、find()メソッドと$regex演算子を組み合わせて使用します。$regexを使うことで、部分一致や大文字・小文字を区別しない柔軟な検索が可能になります。この記事では、実際のコレクションを作成しながら、特定の文字列を含むドキュメントを抽出する手順を解説します。1. テスト用コレクションとドキュメントの作成まず、insertOne()メソッドを使ってサンプルコレクション「demo597」にドキュメントを挿入します。> db.demo597.insertOne({
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "