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

MongoDBで条件に一致しないドキュメントだけを除外して取得する方法|$ne・$nin演算子の使い方

MongoDBで「特定の条件に一致しないドキュメント」をすべて取得したい場面はよくあります。例えば、特定の値を除外したデータの一覧を作りたい場合などです。この記事では、除外条件が1つの場合2つ以上の場合それぞれのクエリの書き方を、実際の実行例とともに解説します。

結論:使うのは $ne と $nin 演算子

MongoDBで条件を「除外」してドキュメントを取得するには、以下の2つの比較演算子を使います。

  • $ne(not equal):指定した1つの値と等しくないドキュメントを取得
  • $nin(not in):指定した複数の値のいずれにも一致しないドキュメントを取得

基本構文

ケース1:条件が1つの場合($ne)

db.yourCollectionName.find({yourFieldName:{$ne:"yourValue"}}).pretty();

フィールドの値が指定した値と異なるドキュメントのみが返されます。

ケース2:条件が2つ以上の場合($nin)

db.yourCollectionName.find({yourFieldName:{$nin:["yourValue1","yourValue2"]}}).pretty();

$ninには配列形式で除外したい値を渡します。配列内のどの値にも一致しないドキュメントだけが取得できます。

動作確認用のコレクションを作成する

ここからは、実際にコレクションを作成して挙動を確認していきます。まず、学生名と科目名を持つドキュメントを挿入します。

> db.findAllExceptFromOneOrtwoDemo.insertOne({"StudentName":"Larry","StudentSubjectName":"Java"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c993d82330fd0aa0d2fe4d2")
}
> db.findAllExceptFromOneOrtwoDemo.insertOne({"StudentName":"Chris","StudentSubjectName":"C++"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c993d8f330fd0aa0d2fe4d3")
}
> db.findAllExceptFromOneOrtwoDemo.insertOne({"StudentName":"Robert","StudentSubjectName":"C"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c993d99330fd0aa0d2fe4d4")
}
> db.findAllExceptFromOneOrtwoDemo.insertOne({"StudentName":"David","StudentSubjectName":"Python"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c993da4330fd0aa0d2fe4d5")
}

次に、find()メソッドですべてのドキュメントを表示して、登録内容を確認しましょう。

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

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

{
   "_id" : ObjectId("5c993d82330fd0aa0d2fe4d2"),
   "StudentName" : "Larry",
   "StudentSubjectName" : "Java"
}
{
   "_id" : ObjectId("5c993d8f330fd0aa0d2fe4d3"),
   "StudentName" : "Chris",
   "StudentSubjectName" : "C++"
}
{
   "_id" : ObjectId("5c993d99330fd0aa0d2fe4d4"),
   "StudentName" : "Robert",
   "StudentSubjectName" : "C"
}
{
   "_id" : ObjectId("5c993da4330fd0aa0d2fe4d5"),
   "StudentName" : "David",
   "StudentSubjectName" : "Python"
}

合計4件のドキュメントが登録されていることが確認できました。それでは、このデータを使って各ケースを実行してみます。

ケース1:単一の条件を除外する($ne)

まずは、科目名が「C」ではないドキュメントをすべて取得してみます。$ne演算子を使ったクエリは以下の通りです。

> db.findAllExceptFromOneOrtwoDemo.find({StudentSubjectName:{$ne:"C"}}).pretty();

実行結果:

{
   "_id" : ObjectId("5c993d82330fd0aa0d2fe4d2"),
   "StudentName" : "Larry",
   "StudentSubjectName" : "Java"
}
{
   "_id" : ObjectId("5c993d8f330fd0aa0d2fe4d3"),
   "StudentName" : "Chris",
   "StudentSubjectName" : "C++"
}
{
   "_id" : ObjectId("5c993da4330fd0aa0d2fe4d5"),
   "StudentName" : "David",
   "StudentSubjectName" : "Python"
}

科目が「C」のRobertさんのドキュメントだけが除外され、残りの3件が取得できました。

ケース2:2つの条件を除外する($nin)

続いて、「C++」と「Python」の両方を除外したい場合です。このように複数の値を同時に除外するには、$nin演算子に配列で値を指定します。

> db.findAllExceptFromOneOrtwoDemo.find({StudentSubjectName:{$nin:["C++","Python"]}}).pretty();

実行結果:

{
   "_id" : ObjectId("5c993d82330fd0aa0d2fe4d2"),
   "StudentName" : "Larry",
   "StudentSubjectName" : "Java"
}
{
   "_id" : ObjectId("5c993d99330fd0aa0d2fe4d4"),
   "StudentName" : "Robert",
   "StudentSubjectName" : "C"
}

C++のChrisさんとPythonのDavidさんのドキュメントが除外され、JavaのLarryさんとCのRobertさんだけが返されました。

まとめ

  • 除外したい値が1つだけなら $ne を使う
  • 除外したい値が複数あるなら $nin に配列で渡す

$neと$ninは、ログ分析やリストのフィルタリングなど、特定のレコードを除外して集計・表示したいときに非常に便利な演算子です。用途に応じて正しく使い分けましょう。

  1. MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法

    点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、4件のドキュメントを登録します。> db.demo709.insertOne({Name:"John","Marks":75}); {    "acknowledged

  2. MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法

    MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法 MongoDBで複数の条件の「すべて」に一致するドキュメントを抽出したい場合には、Aggregationパイプラインの$matchステージと$and演算子を組み合わせます。本記事では、ネストされたドキュメント構造を持つコレクションを例に、実際のコードを通して具体的な手順を解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、ネストした構造を持つドキュメントを1件挿入し、テスト用のコレクションを作成します。 > db.demo574.insertOne( .