MongoDBで特定のドキュメントを除外して残りをすべて取得する方法($norと$andの活用)
MongoDBで特定のドキュメントを除外する方法
MongoDBで、特定の条件に一致するドキュメントだけを除外し、それ以外のすべてのドキュメントを取得したい場合があります。そのようなときに便利なのが、$nor演算子と$and演算子を組み合わせたクエリです。
$norは「指定した条件のいずれにも一致しないドキュメント」を返す論理演算子です。$andと組み合わせることで、「複数の条件がすべて一致するドキュメント」をまとめて除外できます。
サンプルコレクションの作成
まず、動作を確認するために、ドキュメントを含むコレクションを作成しましょう。
> db.demo1.insertOne({"StudentName":"Chris","StudentMarks":38});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e08a4f025ddae1f53b62216")
}
> db.demo1.insertOne({"StudentName":"David","StudentMarks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e08a4f725ddae1f53b62217")
}
> db.demo1.insertOne({"StudentName":"Mike","StudentMarks":96});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e08a4fd25ddae1f53b62218")
}
すべてのドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。
> db.demo1.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e08a4f025ddae1f53b62216"),
"StudentName" : "Chris",
"StudentMarks" : 38
}
{
"_id" : ObjectId("5e08a4f725ddae1f53b62217"),
"StudentName" : "David",
"StudentMarks" : 78
}
{
"_id" : ObjectId("5e08a4fd25ddae1f53b62218"),
"StudentName" : "Mike",
"StudentMarks" : 96
}
$norと$andを使った除外クエリ
続いて、クエリの逆(否定)、つまり特定のドキュメントを除外するクエリを見てみましょう。ここでは「StudentNameが'David'かつStudentMarksが78」という条件に一致するドキュメントを除外します。
> db.demo1.find({$nor:[{$and:[{'StudentName':'David'},{'StudentMarks':78}]}]});
このクエリを実行すると、次の出力が得られます。結果には、点数が78以外の学生レコードのみが表示されます。
{ "_id" : ObjectId("5e08a4f025ddae1f53b62216"), "StudentName" : "Chris", "StudentMarks" : 38 }
{ "_id" : ObjectId("5e08a4fd25ddae1f53b62218"), "StudentName" : "Mike", "StudentMarks" : 96 }
ポイントのまとめ
このように、$norの中に$andで条件をネストすることで、複数のフィールドにまたがる条件に一致するドキュメントを簡単に除外できます。単一の条件だけでなく、複合条件での除外が必要な場面でぜひ活用してください。
-
MongoDBで「_id」以外のすべてのフィールド値を表示するクエリ方法
MongoDBでは、ドキュメントを取得すると自動的に _id フィールドが含まれますが、場合によってはこのフィールドを除外し、他のフィールド値だけを表示したいことがあります。本記事では、コレクションの作成から、_id を除いたすべてのフィールド値を表示するまでの一連の手順を解説します。1. ドキュメントを含むコレクションを作成するまずは、サンプルとなるコレクションを作成しましょう。以下のコマンドを実行して、複数のドキュメントを一括挿入します。> db.demo590.insert([... { "Name": "
-
MySQLですべてのレコードを1行にまとめて取得する方法(GROUP_CONCAT活用)
GROUP_CONCAT()を使って複数行のデータを1行に連結するテーブル内の複数レコードを、区切り文字でつなげて1つの文字列として取得したい場合は、MySQLのGROUP_CONCAT()関数を使用します。この関数を使うことで、パスのような形式の文字列も簡単に生成できます。ここでは、「E:/AllPrograms/ChatApplicationInJava/MainFolder」のようにフォルダ階層を表す文字列を作成する例を見ていきましょう。1. サンプルテーブルの作成まず、Locationカラムを持つテーブルを作成します。mysql> create table DemoTable13