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

MongoDBでフィールドがnullまたは未設定のレコードをクエリする方法をわかりやすく解説

MongoDBでは、「フィールドが明示的にnullに設定されている」ケースと、「フィールド自体がドキュメント内に存在しない」ケースを、それぞれ異なる方法でクエリできます。本記事では、両方のケースの構文と具体的な実行例を通じて、正しい使い分け方を解説します。

基本の構文

ケース1:フィールドが存在し、値がnullに設定されている場合

フィールドは存在しているものの、値としてnullが代入されているレコードを調べるには、次の構文を使用します。

db.yourCollectionName.count({yourFieldName: null});

ケース2:フィールド自体が存在しない場合

フィールドそのものがドキュメントに存在しない(一度も設定されていない)レコードを調べるには、$exists演算子を組み合わせます。

db.yourCollectionName.count({yourFieldName: {$exists: false}});

サンプルデータの準備

両方の構文の動作を確認するため、従業員情報を格納したコレクションを作成します。以下のクエリでドキュメントを挿入していきましょう。

> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Larry","EmployeeAge":null,"EmployeeSalary":18500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a995c6cea1f28b7aa07fe")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Bob","EmployeeAge":21,"EmployeeSalary":23500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a99836cea1f28b7aa07ff")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Carol","EmployeeSalary":45500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a999b6cea1f28b7aa0800")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Mike","EmployeeAge":null,"EmployeeSalary":45500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a99bb6cea1f28b7aa0801")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Ramit","EmployeeSalary":85500});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a99d76cea1f28b7aa0802")
}

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

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

実行結果は以下の通りです。

{
   "_id" : ObjectId("5c8a995c6cea1f28b7aa07fe"),
   "EmployeeName" : "Larry",
   "EmployeeAge" : null,
   "EmployeeSalary" : 18500
}
{
   "_id" : ObjectId("5c8a99836cea1f28b7aa07ff"),
   "EmployeeName" : "Bob",
   "EmployeeAge" : 21,
   "EmployeeSalary" : 23500
}
{
   "_id" : ObjectId("5c8a999b6cea1f28b7aa0800"),
   "EmployeeName" : "Carol",
   "EmployeeSalary" : 45500
}
{
   "_id" : ObjectId("5c8a99bb6cea1f28b7aa0801"),
   "EmployeeName" : "Mike",
   "EmployeeAge" : null,
   "EmployeeSalary" : 45500
}
{
   "_id" : ObjectId("5c8a99d76cea1f28b7aa0802"),
   "EmployeeName" : "Ramit",
   "EmployeeSalary" : 85500
}

このサンプルデータには3つのパターンが含まれています。「EmployeeAgeにnullが明示的に設定されている」ドキュメント(Larry、Mike)、「EmployeeAgeフィールド自体が存在しない」ドキュメント(Carol、Ramit)、そして「通常の値が設定されている」ドキュメント(Bob)です。

ケース1の実行例:nullに関連するレコードのカウント

EmployeeAgeフィールドに対してnull条件を指定してレコード数を取得します。次のクエリを実行します。

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: null});

実行結果:

4

結果が「4」になった点に注目してください。これは、MongoDBでは{field: null}という条件が「nullが明示的に設定されているドキュメント」と「フィールド自体が存在しないドキュメント」の両方にマッチするためです。つまり、このクエリ単独では両者を区別できないことに注意が必要です。

ケース2の実行例:フィールドが存在しないレコードのカウント

EmployeeAgeフィールド自体が存在しないレコードのみを取得するには、$exists演算子を使用した次のクエリを実行します。

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: {$exists: false}});

実行結果:

2

結果「2」は、CarolとRamitのようにEmployeeAgeフィールドを持たないドキュメントだけを正確に抽出できていることを示しています。

補足:nullのみを厳密に判定したい場合

「nullが明示的に設定されたドキュメントだけ」を対象にしたい場合は、$existsとnull条件を組み合わせます。

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: {$exists: true, $eq: null}});

なお、最近のMongoDBのバージョンではcount()メソッドは非推奨となっているため、実運用ではcountDocuments()の使用が推奨されます。

> db.fieldIsNullOrNotSetDemo.countDocuments({EmployeeAge: null});

まとめ

  • {field: null}:nullが設定されたドキュメントと、フィールドが存在しないドキュメントの両方にマッチする
  • {field: {$exists: false}}:フィールド自体が存在しないドキュメントのみにマッチする
  • nullのみを厳密に判定したい場合は{$exists: true, $eq: null}を併用する
  • 新しいバージョンのMongoDBでは、count()の代わりにcountDocuments()を使用するのが望ましい
  1. MongoDBでnullではないことをチェックする方法|$ne演算子の使い方

    MongoDBでフィールドがnullではないことを確認したい場合、$ne(not equal)演算子を使用します。この記事では、実際にコレクションを作成しながら、null以外のドキュメントを抽出する方法を解説します。1. サンプルコレクションの作成まず、テスト用のコレクションにドキュメントを挿入してみましょう。> db.demo764.insertOne({"LoginUserName":"Chris","LoginPassword":"Chris_12"}); {    &qu

  2. MySQLでNOT NULLの値に対して1を設定する方法(IF関数とIS NOT NULLの使い方)

    MySQLでNOT NULLの値に1を設定するにはMySQLでは、IS NOT NULL演算子とIF()関数を組み合わせることで、値がNULLでない場合に「1」、NULLの場合に「0」を返すことができます。データの存在チェックやフラグ管理など、さまざまな場面で活用できる便利なテクニックです。基本構文NOT NULLかどうかを判定して1を設定する基本構文は以下のとおりです。select if( is not NULL,1,0) as anyAliasName;実際に動作するクエリを見てみましょう。mysql> select if( is not NULL,1,0);このクエリを実行すると、