MongoDBの$or演算子でOR条件クエリを作成する方法
$or演算子とは?MongoDBでのOR条件クエリの基本
MongoDBでは、$or演算子を使うことで、複数の条件のうちいずれか一つでも一致するドキュメントを取得できます。SQLの「OR」句に相当する機能で、柔軟なデータ検索には欠かせません。
ここでは、実際にサンプルコレクションを作成しながら、OR条件クエリの動きを順番に確認していきましょう。
サンプルコレクションの作成
まず、insertOne()メソッドでドキュメントを5件挿入し、テスト用のコレクション「orConditionDemo」を作成します。各ドキュメントは顧客名(CustomerName)と出荷日(ShippingDate)を持つシンプルな構造です。クエリは以下の通りです。
> db.orConditionDemo.insertOne({"CustomerName":"Larry","ShippingDate":new ISODate("2018-01-29")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5262f684a30fbdfd56a")
}
> db.orConditionDemo.insertOne({"CustomerName":"Mike","ShippingDate":new ISODate("2019-04-13")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5362f684a30fbdfd56b")
}
> db.orConditionDemo.insertOne({"CustomerName":"Bob","ShippingDate":new ISODate("2019-02-21")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5422f684a30fbdfd56c")
}
> db.orConditionDemo.insertOne({"CustomerName":"David","ShippingDate":new ISODate("2019-03-15")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5532f684a30fbdfd56d")
}
> db.orConditionDemo.insertOne({"CustomerName":"John","ShippingDate":new ISODate("2019-03-19")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec56c2f684a30fbdfd56e")
}
登録済みドキュメントの確認
find()メソッドを実行すると、コレクション内のすべてのドキュメントを表示できます。クエリは次のようになります。
> db.orConditionDemo.find().pretty();
出力は以下の通りです。
{
"_id" : ObjectId("5c8ec5262f684a30fbdfd56a"),
"CustomerName" : "Larry",
"ShippingDate" : ISODate("2018-01-29T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5362f684a30fbdfd56b"),
"CustomerName" : "Mike",
"ShippingDate" : ISODate("2019-04-13T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5422f684a30fbdfd56c"),
"CustomerName" : "Bob",
"ShippingDate" : ISODate("2019-02-21T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5532f684a30fbdfd56d"),
"CustomerName" : "David",
"ShippingDate" : ISODate("2019-03-15T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec56c2f684a30fbdfd56e"),
"CustomerName" : "John",
"ShippingDate" : ISODate("2019-03-19T00:00:00Z")
}
$or演算子を使ったOR条件クエリの実行
それでは、複数の条件を$or演算子で組み合わせたクエリを見てみましょう。以下の例では、「出荷日(ShippingDate)が現在日時以降である」または「出荷日がnullである」という2つの条件を指定しています。
> db.orConditionDemo.find({$or: [{ShippingDate: {$gte: new ISODate()}}, {ShippingDate: null}]}).pretty();
出力結果は以下の通りです。
{
"_id" : ObjectId("5c8ec5362f684a30fbdfd56b"),
"CustomerName" : "Mike",
"ShippingDate" : ISODate("2019-04-13T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec56c2f684a30fbdfd56e"),
"CustomerName" : "John",
"ShippingDate" : ISODate("2019-03-19T00:00:00Z")
}
クエリのポイント解説
- $or演算子:配列形式で複数の条件を受け取り、少なくとも1つに一致したドキュメントを返します。
- $gte演算子:「以上(greater than or equal)」を表し、new ISODate()で生成した現在日時以降の値に一致します。
- nullとの比較:フィールドが存在しない、または明示的にnullが設定されているドキュメントに一致します。
今回の例では、クエリ実行時点より未来の出荷日を持つMikeとJohnの2件のみが該当しました。このように$or演算子を活用すれば、「期限が未来のデータ」と「未設定のデータ」を一度に抽出するなど、実務でよくある柔軟な検索条件を簡単に実現できます。
-
MySQLでTRUNCATEに条件を指定できる?WHERE句が使えない理由とDELETE文による代替方法
MySQLでは、TRUNCATE文に条件(WHERE句)を指定することはできません。TRUNCATEはテーブル内の全データを一括削除するためのコマンドであり、特定の行だけを対象に削除する使い方は想定されていません。そのため、条件を付けてレコードを削除したい場合は、代わりにDELETE文を使用します。DELETE文の基本構文DELETE FROM テーブル名 WHERE 条件;この構文であれば、任意の条件に一致する行だけを柔軟に削除できます。ただし、処理速度という観点では注意点があります。TRUNCATEはログへの書き込みを行わないため大量データの削除が高速である一方、DELETEは削除対象の各
-
MySQLでIF条件を使ったSUM(合計)クエリの書き方を実例で解説
MySQLのSUM関数とIF条件を組み合わせた集計クエリとはMySQLにおけるSUM()は、数値カラムの合計値を求めるための代表的な集計関数です。IF()関数と組み合わせることで、「特定の条件に一致する行だけを対象に合計を計算する」という柔軟な集計が可能になります。この記事では、実際にサンプルテーブルを作成し、IF条件付きのSUMクエリの使い方を段階的に解説します。サンプルテーブルの作成まず、支払い方法と金額を格納するテーブルを作成します。テーブル作成用のクエリは次のとおりです。mysql> create table SumWithIfCondition &nbs