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

MongoDB:$inと$ninを組み合わせて「MongoDB」を含み「Java」を含まないドキュメントを取得する方法

MongoDBで配列型のフィールドを検索する際、「特定の値は含んでいるが、別の値は含んでいない」という条件でドキュメントだけを取り出したいケースがあります。たとえば「Subjects(科目)」フィールドに「MongoDB」は含まれているけれど「Java」は含まれていないドキュメントを取得したい場合です。

このような条件検索には、$in$nin$and 演算子で組み合わせるのが効果的です。本記事では、実際にサンプルコレクションを作成しながら、その具体的な手順をわかりやすく解説します。

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

まず、insertOne() メソッドを使ってテスト用のドキュメントをいくつか挿入します。

> db.demo140.insertOne({"Id":101,"Subjects":["MongoDB","MySQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c149fdf09dd6d08539a9")
}
> db.demo140.insertOne({"Id":102,"Subjects":["MongoDB","Java"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c14cfdf09dd6d08539aa")
}
> db.demo140.insertOne({"Id":103,"Subjects":["MongoDB","PL/SQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c157fdf09dd6d08539ab")
}
> db.demo140.insertOne({"Id":104,"Subjects":["MongoDB","SQL Server"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c163fdf09dd6d08539ac")
}
> db.demo140.insertOne({"Id":105,"Subjects":["C","C++"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c16ffdf09dd6d08539ad")
}

2. 登録された全ドキュメントの確認

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

> db.demo140.find();

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

{ "_id" : ObjectId("5e31c149fdf09dd6d08539a9"), "Id" : 101, "Subjects" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5e31c14cfdf09dd6d08539aa"), "Id" : 102, "Subjects" : [ "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e31c157fdf09dd6d08539ab"), "Id" : 103, "Subjects" : [ "MongoDB", "PL/SQL" ] }
{ "_id" : ObjectId("5e31c163fdf09dd6d08539ac"), "Id" : 104, "Subjects" : [ "MongoDB", "SQL Server" ] }
{ "_id" : ObjectId("5e31c16ffdf09dd6d08539ad"), "Id" : 105, "Subjects" : [ "C", "C++" ] }

3. 「MongoDB」を含み「Java」を含まないドキュメントを取得するクエリ

ここからが本題です。「MongoDB」は含むが「Java」は含まないドキュメントを取得するには、$and の中で $in と $nin を次のように組み合わせます。

> db.demo140.find({$and:[{Subjects:{$in:['MongoDB']}}, {Subjects:{$nin:['Java']}}]}).toArray();

クエリのポイント

  • $in:['MongoDB'] … Subjects 配列に「MongoDB」が含まれていることを条件とします。
  • $nin:['Java'] … Subjects 配列に「Java」が含まれていないことを条件とします。
  • $and … 上記の2つの条件を同時に満たすドキュメントのみを抽出します。

なお、文字列などのスカラー値からなる配列を対象とする場合、$elemMatch を使わずに、このように $in と $nin を個別の条件として $and で結合する方が、意図した結果を確実に得られます。

4. 実行結果

上記のクエリを実行すると、次の3件のドキュメントが出力されます。

[
   {
      "_id" : ObjectId("5e31c149fdf09dd6d08539a9"),
      "Id" : 101,
      "Subjects" : [
         "MongoDB",
         "MySQL"
      ]
   },
   {
      "_id" : ObjectId("5e31c157fdf09dd6d08539ab"),
      "Id" : 103,
      "Subjects" : [
         "MongoDB",
         "PL/SQL"
      ]
   },
   {
      "_id" : ObjectId("5e31c163fdf09dd6d08539ac"),
      "Id" : 104,
      "Subjects" : [
         "MongoDB",
         "SQL Server"
      ]
   }
]

結果を見ると、「MongoDB」と「Java」の両方を含む Id:102 のドキュメントや、「MongoDB」を含まない Id:105 のドキュメントは除外され、条件を満たす3件だけが正しく取得できていることがわかります。この手法を使えば、配列フィールドに対する「含む・含まない」の複合条件もシンプルに実現できます。

  1. MongoDBで$in演算子を使って特定の複数ドキュメントを取得する方法

    MongoDBで特定の複数のドキュメントを一度に取得したい場合、$in 演算子を使用します。$in は、指定した配列内のいずれかの値に一致するドキュメントだけを抽出できる便利な比較演算子です。この記事では、実際にコレクションを作成し、$in を使って特定の複数ドキュメントを取得する手順を順番に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使ってサンプル用のコレクション「demo593」にドキュメントを挿入します。> db.demo593.insertOne({id:1,Name:Chris});{ acknowledged : tr

  2. MongoDBで特定の数値より大きいフィールド値を持つドキュメントを照合して取得する方法

    MongoDBでドキュメントを照合(マッチング)するには、集計パイプライン(aggregate)内で $match を使用します。さらに、特定の数値より大きい値を条件にしたい場合は、比較演算子の $gt(greater than)を組み合わせます。この記事では、実際にコレクションを作成し、$sort や $limit と組み合わせながら、条件に一致するドキュメントを取得する手順を解説します。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、ドキュメントを含むコレクションを作成しましょう。> db.demo730.insertOne({Name : Chri