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

MongoDBで文字数(長さ)を条件にドキュメントを検索する方法


文字数(長さ)を条件にMongoDBをクエリするには?

MongoDBで「文字列の長さ」を条件にドキュメントを検索したい場合は、$regex演算子と正規表現を組み合わせるのが最も手軽な方法です。正規表現の量指定子 {最小値,最大値} を使うことで、特定の文字数範囲に一致するドキュメントだけを抽出できます。

基本構文

db.yourCollectionName.find({ 'yourFieldName': { $regex: /^.{minLength,maxLength}$/ } });

この正規表現の各要素は、それぞれ次のような意味を持っています。

  • ^ … 文字列の先頭を表します
  • $ … 文字列の末尾を表します
  • .{minLength,maxLength} … 任意の1文字が「minLength」回以上「maxLength」回以下繰り返されることを意味します

サンプルコレクションの作成

まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。以下がそのクエリです。

> db.queryLengthDemo.insertOne({"StudentFullName":"John Smith"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9a01ae353decbc2fc927c0")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"John Doe"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9a01b4353decbc2fc927c1")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"David Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9a01c2353decbc2fc927c2")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"Robert Taylor"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9a01e2353decbc2fc927c3")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"Chris Williams"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9a01f1353decbc2fc927c4")
}

登録済みドキュメントの確認

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

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

実行すると、次の出力が得られます。

{
   "_id" : ObjectId("5c9a01ae353decbc2fc927c0"),
   "StudentFullName" : "John Smith"
}
{
   "_id" : ObjectId("5c9a01b4353decbc2fc927c1"),
   "StudentFullName" : "John Doe"
}
{
   "_id" : ObjectId("5c9a01c2353decbc2fc927c2"),
   "StudentFullName" : "David Miller"
}
{
   "_id" : ObjectId("5c9a01e2353decbc2fc927c3"),
   "StudentFullName" : "Robert Taylor"
}
{
   "_id" : ObjectId("5c9a01f1353decbc2fc927c4"),
   "StudentFullName" : "Chris Williams"
}

文字数を条件にドキュメントを検索する

それでは、実際に文字数を条件としたクエリを実行してみましょう。ここでは「StudentFullName」フィールドの文字数が9文字以上12文字以下のドキュメントを検索します。

> db.queryLengthDemo.find({ StudentFullName: { $regex: /^.{9,12}$/ } }).pretty();

実行結果は次のとおりです。

{
   "_id" : ObjectId("5c9a01ae353decbc2fc927c0"),
   "StudentFullName" : "John Smith"
}
{
   "_id" : ObjectId("5c9a01c2353decbc2fc927c2"),
   "StudentFullName" : "David Miller"
}

このように、「John Smith」(10文字)と「David Miller」(12文字)のみが抽出されました。一方、「John Doe」(8文字)、「Robert Taylor」(13文字)、「Chris Williams」(14文字)は指定した範囲外のため除外されています。

補足:$exprと$strLenCPを使った代替方法

正規表現を使わない方法として、集計演算子の$strLenCP$exprと組み合わせれば、文字数を数値比較で判定することもできます。日本語などのマルチバイト文字を含む文字列を正確に扱いたい場合に特に有効です。

db.queryLengthDemo.find({
  $expr: {
    $and: [
      { $gte: [ { $strLenCP: "$StudentFullName" }, 9 ] },
      { $lte: [ { $strLenCP: "$StudentFullName" }, 12 ] }
    ]
  }
});

用途やデータの特性に応じて$regex$strLenCPを使い分けることで、より柔軟で正確な文字数検索が実現できます。

  1. 【MongoDB】limit()メソッドでクエリ結果の件数を制限する方法

    MongoDBで取得するドキュメントの件数を制限したい場合には、limit()メソッドを使用します。この記事では、実際にコレクションを作成しながら、limit()の基本的な使い方を具体例とともに解説します。 1. コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、サンプル用コレクション「demo58」に4件のドキュメントを挿入してみましょう。 > db.demo58.insertOne({"Name":"David"}); { "acknowledged" : true, &quo

  2. MongoDBで大文字と小文字を区別せずに検索する方法($regexの使い方)

    MongoDBで大文字と小文字を区別しない(ケースインセンシティブな)検索を実行したい場合は、find()メソッドの中で正規表現($regex)を使用します。基本となる構文は以下の通りです。db.demo572.find({yourFieldName : { $regex : /^yourValue$/i}});正規表現のポイントこの構文で重要なのは、パターンの末尾に付ける「i」オプションです。このフラグを指定することで、マッチング時に大文字と小文字の違いが無視されます。また、^(先頭)と$(末尾)で値を囲むことで、部分一致ではなく完全一致の検索になります。それでは、実際にサンプルコレクション