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は、ログ分析やリストのフィルタリングなど、特定のレコードを除外して集計・表示したいときに非常に便利な演算子です。用途に応じて正しく使い分けましょう。
-
MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法
点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、4件のドキュメントを登録します。> db.demo709.insertOne({Name:"John","Marks":75}); { "acknowledged
-
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法 MongoDBで複数の条件の「すべて」に一致するドキュメントを抽出したい場合には、Aggregationパイプラインの$matchステージと$and演算子を組み合わせます。本記事では、ネストされたドキュメント構造を持つコレクションを例に、実際のコードを通して具体的な手順を解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、ネストした構造を持つドキュメントを1件挿入し、テスト用のコレクションを作成します。 > db.demo574.insertOne( .