MongoDBでフィールド値を比較する方法|$where演算子の使い方を解説
MongoDBでフィールド値を比較するには?
MongoDBでは、$where演算子を使うことで、同一ドキュメント内の異なるフィールド同士の値を比較できます。通常のクエリ条件は「フィールドと固定値」の比較しか行えませんが、$whereを使えばJavaScriptの式によってフィールド間の比較が可能になります。
ここでは、実際にサンプルコレクションを作成しながら、具体的な使い方を順番に見ていきましょう。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを挿入し、テスト用のコレクションを作成します。
> db.comparingFieldDemo.insertOne({"Value1":30,"Value2":40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c99ed2d6669774125246e")
}
> db.comparingFieldDemo.insertOne({"Value1":60,"Value2":70});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c99f62d6669774125246f")
}
> db.comparingFieldDemo.insertOne({"Value1":160,"Value2":190});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c99ff2d66697741252470")
}
> db.comparingFieldDemo.insertOne({"Value1":200,"Value2":160});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c9a0b2d66697741252471")
}2. 登録したドキュメントの確認
find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを見やすい形式で表示できます。
> db.comparingFieldDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c9c99ed2d6669774125246e"),
"Value1" : 30,
"Value2" : 40
}
{
"_id" : ObjectId("5c9c99f62d6669774125246f"),
"Value1" : 60,
"Value2" : 70
}
{
"_id" : ObjectId("5c9c99ff2d66697741252470"),
"Value1" : 160,
"Value2" : 190
}
{
"_id" : ObjectId("5c9c9a0b2d66697741252471"),
"Value1" : 200,
"Value2" : 160
}3. $where演算子でフィールド値を比較する
それでは、本題であるフィールド値同士の比較を行うクエリです。$whereの中で「this.Value1 > this.Value2」というJavaScript式を指定すると、「Value1がValue2より大きい」ドキュメントだけを抽出できます。
> db.comparingFieldDemo.find({ $where: "this.Value1 > this.Value2" } );実行結果は以下の通りです。4件のうち、Value1がValue2を上回っているのは最後の1件のみです。
{ "_id" : ObjectId("5c9c9a0b2d66697741252471"), "Value1" : 200, "Value2" : 160 }4. 比較条件を逆にした場合
今度は不等号を逆向きにして、「Value1がValue2より小さい」ドキュメントを検索してみます。
> db.comparingFieldDemo.find({ $where: "this.Value1 < this.Value2" } );この場合、最初の3件が該当します。
{ "_id" : ObjectId("5c9c99ed2d6669774125246e"), "Value1" : 30, "Value2" : 40 }
{ "_id" : ObjectId("5c9c99f62d6669774125246f"), "Value1" : 60, "Value2" : 70 }
{ "_id" : ObjectId("5c9c99ff2d66697741252470"), "Value1" : 160, "Value2" : 190 }補足:$expr演算子という選択肢
MongoDB 3.6以降では、$whereの代わりに$expr演算子を使うこともできます。$exprは集計パイプラインの式をクエリ内で利用できるため、インデックスを活用しやすく、$whereよりも高速に動作するケースが多くなっています。
> db.comparingFieldDemo.find({ $expr: { $gt: ["$Value1", "$Value2"] } });なお、$whereは各ドキュメントに対してJavaScriptを実行する仕組みのため、大規模なコレクションではパフォーマンスが低下しやすい点に注意してください。データ量や用途に応じて、$whereと$exprを使い分けることが重要です。
-
MongoDBに配列値を保存する方法【insertOne()の使い方を解説】
MongoDBでは、フィールドの値として配列やドキュメントの配列をそのまま保存できます。本記事では、insertOne()メソッドを使って、複数のユーザー情報を含む配列値をコレクションに挿入する手順を解説します。 1. 配列値を含むドキュメントを挿入する まず、配列値を格納したドキュメントを持つコレクションを作成しましょう。以下の例では、demo321というコレクションに、UserDetailsフィールドとしてユーザー情報の配列を保存しています。 > db.demo321.insertOne({UserDetails:[{UserId:101,UserName:Chris},{UserI
-
MongoDBでドキュメントフィールドの値から別の値(TotalPrice − Discount)を差し引いて計算する方法
MongoDBでは、aggregate()内の $subtract 演算子を使うことで、ドキュメントフィールドの値から別のフィールドの値を差し引いた結果を計算できます。例えば、総額(TotalPrice)から割引額(DiscountPrice)を引いた実質価格を求めるようなケースに便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドでコレクションにドキュメントを挿入します。> db.demo599.insertOne({TotalPrice:250,DiscountPrice:35});{ ackno