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

MongoDBで真偽値(true/false)を条件にドキュメントを検索する方法

MongoDBでフィールドの有無や値の状態をもとにドキュメントを検索したい場合、find()メソッドと$exists演算子を組み合わせるのが効果的です。ネストされた配列内のフィールドを調べる際には、ドット表記(dot notation)を使用します。

この記事では、実際のコード例を通して、配列内の特定フィールドが存在しないドキュメントを抽出する方法を解説します。

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

まず、テスト用のコレクション「demo367」を作成し、2つのドキュメントを挿入します。片方のドキュメントにはdetails.Subjectフィールドが存在し、もう片方には存在しない構造になっています。

> db.demo367.insertOne(
...     { "Id" : "102",
...     "details" : [ { "Name" : "David"},
...     { "Age" : 23, "CountryName" : "UK"} ],
...     "isMarried" : false }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e57e0b62ae06a1609a00ae8")
}
> db.demo367.insertOne(
...     { "Id" : "101",
...     "details" : [ { "Name" : "Chris", "Subject" : [ "MySQL" ] },
...     { "Age" : 21, "CountryName" : "US"} ],
...     "isMarried" : true }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e57e0be2ae06a1609a00ae9")
}

この例では、isMarriedフィールドによって各ドキュメントはtrueまたはfalseの値を持っています。また、2番目のドキュメントのみdetails配列内にSubjectフィールドが含まれている点に注目してください。

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

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

> db.demo367.find();

実行すると、以下のような結果が出力されます。

{
    "_id" : ObjectId("5e57e0b62ae06a1609a00ae8"), "Id" : "102", "details" : [
        { "Name" : "David" }, { "Age" : 23, "CountryName" : "UK" } ], "isMarried" : false }
{
    "_id" : ObjectId("5e57e0be2ae06a1609a00ae9"), "Id" : "101", "details" : [
        { "Name" : "Chris", "Subject" : [ "MySQL" ] }, { "Age" : 21, "CountryName" : "US" } ], "isMarried" : true 
}

3. $exists演算子を使った条件検索

ここからが本題です。$exists演算子とドット表記を組み合わせることで、「details.Subjectフィールドが存在しない」ドキュメントだけを抽出できます。

> db.demo367.find({"details.Subject": { $exists: false}});

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

{ "_id" : ObjectId("5e57e0b62ae06a1609a00ae8"), "Id" : "102", "details" : [ { "Name" : "David" }, { "Age" : 23, "CountryName" : "UK" } ], "isMarried" : false }

解説:なぜこの結果になるのか

出力を見ると、Id: "102"のドキュメントのみが返されていることがわかります。これは、このドキュメントのdetails配列内にSubjectフィールドが存在しないためです。

  • { $exists: false }:指定したフィールドが存在しないドキュメントを検索します。
  • { $exists: true }:逆に、フィールドが存在するドキュメントを検索したい場合はこちらを使用します。
  • ドット表記"details.Subject"のように記述することで、配列内のサブドキュメントのフィールドを対象にできます。

なお、$existsはフィールド自体の有無を判定する演算子であり、フィールドの値がtrue/falseであるかを直接判定するものではない点に注意が必要です。値そのもので絞り込みたい場合は、{ "isMarried": false }のように直接値を指定するか、$eq演算子を併用してください。

  1. MongoDBでフィールドの戻り値を制限するクエリの書き方($slice演算子の使い方)

    MongoDBでフィールドの戻り値を制限するクエリの書き方MongoDBで配列フィールドの要素数を制限して取得したい場合は、$slice演算子を使用します。この演算子を活用することで、クエリ結果として返す配列の要素数を柔軟にコントロールできます。ここでは、具体的な手順をサンプルコードとともに解説します。1. コレクションとドキュメントの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo594.insertOne(...    {...    &n

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

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