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

MongoDBで完全一致のドキュメントを検索するクエリの書き方

MongoDBで完全一致検索を行う方法

MongoDBでは、配列と文字列が混在するフィールドから「完全に一致する値」だけを取得したい場合があります。そんなときは $exists 演算子を組み合わせることで、正確な一致判定を実現できます。

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

> db.demo290.insertOne({"ListOfName":"Chris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4c0c9e5d93261e4bc9ea2d")
}
> db.demo290.insertOne({"ListOfName":["Chris","David"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4c0cb05d93261e4bc9ea2e")
}

この例では、「Chris」という単一の文字列を持つドキュメントと、「Chris」と「David」を含む配列を持つドキュメントの2件を作成しました。

find()メソッドで全ドキュメントを表示する

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

> db.demo290.find();

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

{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }
{ "_id" : ObjectId("5e4c0cb05d93261e4bc9ea2e"), "ListOfName" : [ "Chris", "David" ] }

完全一致クエリの実行

ここで問題になるのが、通常の { "ListOfName": "Chris" } という条件では、配列内に「Chris」が含まれているドキュメントも一致扱いになってしまう点です。

そこで、$and$exists を使って、フィールドが配列ではない(インデックス0が存在しない)ことを確認しつつ、完全一致のみを抽出します。

> db.demo290.find({$and: [{'ListOfName.0': {$exists: false}}, {"ListOfName": 'Chris'}]});

このクエリを実行すると、次のように文字列として完全に一致するドキュメントだけが出力されます。

{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }

ポイントまとめ

'ListOfName.0'$exists: false は、そのフィールドが配列ではなく単一の文字列であることを意味します。これにより、配列内に値が含まれるドキュメントを除外し、真の完全一致検索が可能になります。配列とスカラー値が混在するコレクションを扱う際にぜひ活用してください。

  1. MongoDBで配列フィールドに対して$in演算子を使ったクエリを実装する方法

    MongoDBの$in演算子とはMongoDBの$in演算子を使うと、指定した配列内のいずれかの値に一致するドキュメントを検索できます。配列型のフィールドに対して$inを使用すると、その配列の要素に指定値が1つでも含まれていれば、該当するドキュメントとして取得されます。この記事では、実際にコレクションを作成し、配列フィールド「ListOfName」に対して$inクエリを実行する手順を解説します。ドキュメントを含むコレクションの作成まず、ドキュメントを挿入してコレクションを作成しましょう。以下のようにinsertOne()メソッドを使用します。> db.demo520.insertOne(

  2. MongoDBのfind()クエリでネストされたドキュメントを取得する方法

    MongoDBでネストされたドキュメント(入れ子になったサブドキュメントや配列内のオブジェクト)から値を取得するには、「ドット表記(dot notation)」を使用します。この記事では、サンプルコレクションを作成し、find()クエリを使ってネストされたデータを検索する具体的な手順を解説します。 サンプルコレクションの作成 まず、insert()メソッドを使ってドキュメントを含むコレクションを作成しましょう。 > db.demo591.insert([ ... { "Name": "John", "Age": 23 },