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

MongoDBで配列フィールドが空でないレコードを検索する方法

はじめに

MongoDBでは、配列型のフィールドに要素が1つ以上入っている(=空でない)ドキュメントだけを抽出したいケースがよくあります。このような場合は、$ne(Not Equal)演算子を使うと簡単に実現できます。本記事では、実際にコレクションを作成しながら、その手順を分かりやすく解説します。

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

まず、insertOne()メソッドを使って、テスト用のコレクション「arrayFieldIsNotEmptyDemo」にドキュメントを挿入します。ここでは、配列に値が入っているドキュメントと、意図的に空の配列を持つドキュメントを混在させて作成しています。

> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Larry","StudentTechnicalSubject":["Java","C"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe2f1e9c5dd6f1f78291")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Mike","StudentTechnicalSubject":[]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe3b1e9c5dd6f1f78292")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Sam","StudentTechnicalSubject":["MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe491e9c5dd6f1f78293")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"Carol","StudentTechnicalSubject":[]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe521e9c5dd6f1f78294")
}
> db.arrayFieldIsNotEmptyDemo.insertOne({"StudentName":"David","StudentTechnicalSubject":["MySQL","SQL Server"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c76fe661e9c5dd6f1f78295")
}

挿入されたドキュメントの確認

find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。クエリは以下の通りです。

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

出力結果

{
   "_id" : ObjectId("5c76fe2f1e9c5dd6f1f78291"),
   "StudentName" : "Larry",
   "StudentTechnicalSubject" : [
      "Java",
      "C"
   ]
}
{
   "_id" : ObjectId("5c76fe3b1e9c5dd6f1f78292"),
   "StudentName" : "Mike",
   "StudentTechnicalSubject" : [ ]
}
{
   "_id" : ObjectId("5c76fe491e9c5dd6f1f78293"),
   "StudentName" : "Sam",
   "StudentTechnicalSubject" : [
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5c76fe521e9c5dd6f1f78294"),
   "StudentName" : "Carol",
   "StudentTechnicalSubject" : [ ]
}
{
   "_id" : ObjectId("5c76fe661e9c5dd6f1f78295"),
   "StudentName" : "David",
   "StudentTechnicalSubject" : [
      "MySQL",
      "SQL Server"
   ]
}

Larry・Sam・Davidの3件は配列に要素が存在し、MikeとCarolの2件は空の配列になっていることが確認できます。

配列フィールドが空でないレコードを検索するクエリ

それでは本題です。以下のように、$exists:true$ne:[]を組み合わせた条件をfind()メソッドに指定することで、配列フィールドが空でないドキュメントのみを取得できます。

> db.arrayFieldIsNotEmptyDemo.find({StudentTechnicalSubject:{$exists:true,$ne:[]}}).pretty();

出力結果

{
   "_id" : ObjectId("5c76fe2f1e9c5dd6f1f78291"),
   "StudentName" : "Larry",
   "StudentTechnicalSubject" : [
      "Java",
      "C"
   ]
}
{
   "_id" : ObjectId("5c76fe491e9c5dd6f1f78293"),
   "StudentName" : "Sam",
   "StudentTechnicalSubject" : [
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5c76fe661e9c5dd6f1f78295"),
   "StudentName" : "David",
   "StudentTechnicalSubject" : [
      "MySQL",
      "SQL Server"
   ]
}

ご覧の通り、空の配列を持っていたMikeとCarolのドキュメントは除外され、配列に要素が含まれる3件だけが返されました。

クエリのポイント

  • $ne:[] … 空の配列「[]」と等しくないドキュメントを対象にします。これにより、配列に1つ以上の要素が含まれているレコードだけがマッチします。
  • $exists:true … 対象フィールド自体が存在するドキュメントに限定します。この条件がないと、フィールドを持たないドキュメントまでマッチしてしまう可能性があるため、両方を組み合わせるのが確実です。

このように、$ne演算子と$exists演算子を組み合わせることで、MongoDBから「配列フィールドが空でないレコード」を簡単かつ正確に検索することができます。

  1. MongoDBで配列のすべての要素が特定の値を持つドキュメントを検索する方法

    MongoDBで配列内の要素を条件にドキュメントを照合するには、$elemMatch 演算子を使用します。本記事では、配列のすべての要素が特定の値(この例では86)と一致するドキュメントを抽出する方法を、実際のコード例とともに解説します。 1. サンプルコレクションの作成 まず、テスト用のコレクションを作成し、ドキュメントを挿入します。insertOne() メソッドを使って、Details フィールドに Score を持つオブジェクトの配列を格納した3件のドキュメントを登録します。 > db.demo15.insertOne({Details:[{Score:56},{Score:7

  2. MongoDBで指定した件数のレコードを取得するには?limit()メソッドの使い方

    MongoDBでlimit()を使ってレコードを指定件数だけ取得する方法MongoDBで特定の件数のレコード(ドキュメント)を取得したい場合は、limit()メソッドを使用します。limit()は数値型の引数を1つ受け取り、その引数に指定した数だけドキュメントを表示できます。サンプルコレクションの作成まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。ここでは「demo549」というコレクションに4件のドキュメントを挿入します。> db.demo549.insertOne({Name:Chris});{ acknowledged : true