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

MongoDBでドット(.)を含むキーを持つレコードを検索する方法

ドット(.)を含むキーを持つレコードをMongoDBで検索するには、$addFields を使用します。その中で $objectToArray を使ってドキュメントを「キーと値」のペア形式に変換し、$filter$indexOfBytes を組み合わせることで、キーの中にドットが含まれているかどうかを判定できます。

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

まず、ドキュメントを含むコレクションを作成しましょう。

> db.demo364.insertOne(
...   {
...      "details" : {
...         "details1.otherdetails.Name" : {"FirstName":"Chris" }
...      }
...   }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e57d485d0ada61456dc936d")
}
> db.demo364.insertOne(
...    {
...       "details" : {
...          "details1.otherdetails.Name" : {"FirstName":"David" }
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e57d486d0ada61456dc936e")
}

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

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

> db.demo364.find();

このクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } }
{ "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }

ドットを含むキーを持つレコードを検索するクエリ

以下は、キーにドットを含むレコードを抽出するための集計パイプラインです。

> db.demo364.aggregate([
...    {
...       $addFields: {
...          result: {
...             $filter: {
...                input: { $objectToArray: "$details" },
...                cond: {
...                   $ne: [ { $indexOfBytes: [ "$$this.k", "." ] } , -1 ]
...                }
...             }
...          }
...       }
...    },
...    {
...       $match: {
...          $expr: {
...             $ne: [ { $size: "$result" }, 0 ]
...          }
...       }
...    },
...    {
...       $project: {
...          result: 0
...       }
...    }
... ])

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

{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } }
{ "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }

クエリの仕組み

このパイプラインの各ステージの動作は以下のとおりです。

$addFields + $objectToArray: $objectToArraydetails フィールドを「k(キー)」と「v(値)」からなる配列に変換します。

$filter + $indexOfBytes: $$this.k は各要素のキー名を表し、$indexOfBytes はその中にドット(.)が含まれる位置を返します。ドットが見つからない場合は -1 が返されるため、$ne で -1 と比較することで、ドットを含むキーだけを残せます。

$match: 一時フィールド result の配列サイズが 0 ではない(=ドットを含むキーが存在する)ドキュメントのみを通過させます。

$project: 最後に一時的な result フィールドを出力から除外し、元のドキュメント構造のまま結果を返します。

  1. MongoDBで価格が特定の値未満のレコードを検索する方法($lt演算子の使い方)

    MongoDBで、価格(Price)が特定の値より小さいレコードを検索したい場合には、比較クエリ演算子の一つである $lt(less than)を使用します。$ltは「指定した値より小さい」ドキュメントのみを抽出するための演算子です。この記事では、実際にコレクションを作成し、$lt演算子を使って条件に合致するドキュメントを検索する手順を順番に解説します。1. テスト用コレクションの作成まず、insertOne() メソッドを使って、サンプル用のコレクション「demo728」にドキュメントを挿入します。> db.demo728.insertOne({Price:75}); { ac

  2. MySQLのLIKEクエリで「%」文字を含むレコードを検索する方法

    MySQLのLIKE句において、「%」はワイルドカードとして機能するため、そのまま記述しても「%」という文字自体を検索することはできません。「%」を通常の文字(リテラル)として扱いたい場合は、バックスラッシュ(\)でエスケープする必要があります。この記事では、実際のサンプルを使って手順を解説します。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable742 (Value varchar(100)); Query OK, 0 rows affected (2.91 sec)次に、insertコマンドを使用してテーブルにレコードを挿入し