MongoDBで2つのフィールドの合計値に基づいてドキュメントを検索する方法
MongoDBでは、アグリゲーションフレームワーク(Aggregation Framework)を利用することで、2つのフィールドの合計値に基づいてドキュメントを検索できます。具体的には、$projectステージで合計値を計算し、$matchステージで特定の数値より小さいドキュメントを絞り込みます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドを実行します。
> db.searchDocumentsDemo.insertOne({"Value1":100,"Value2":560});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe1eedc6604c74817ce9")
}
> db.searchDocumentsDemo.insertOne({"Value1":300,"Value2":150});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe29edc6604c74817cea")
}
> db.searchDocumentsDemo.insertOne({"Value1":400,"Value2":200});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe30edc6604c74817ceb")
}
> db.searchDocumentsDemo.insertOne({"Value1":190,"Value2":210});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe45edc6604c74817cec")
}登録したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.searchDocumentsDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cd3fe1eedc6604c74817ce9"),
"Value1" : 100,
"Value2" : 560
}
{
"_id" : ObjectId("5cd3fe29edc6604c74817cea"),
"Value1" : 300,
"Value2" : 150
}
{
"_id" : ObjectId("5cd3fe30edc6604c74817ceb"),
"Value1" : 400,
"Value2" : 200
}
{
"_id" : ObjectId("5cd3fe45edc6604c74817cec"),
"Value1" : 190,
"Value2" : 210
}2つのフィールドの合計値でドキュメントを検索するクエリ
ここからが本題です。ドキュメント内の2つのプロパティ(Value1とValue2)を加算した値に基づいてドキュメントを検索するには、以下のようなアグリゲーションクエリを使用します。
> db.searchDocumentsDemo.aggregate([
... { $project: {totalValue: { $add: [ "$Value1", "$Value2" ] } } },
... { $match: {totalValue: {$lt: 500 }} }
... ]);このクエリの仕組みを簡単に解説します。
- $project:演算子
$addを使って、各ドキュメントのValue1とValue2の合計値をtotalValueという新しいフィールドとして計算します。 - $match:計算された
totalValueが500未満($lt: 500)のドキュメントのみを抽出します。
このクエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5cd3fe29edc6604c74817cea"), "totalValue" : 450 }
{ "_id" : ObjectId("5cd3fe45edc6604c74817cec"), "totalValue" : 400 }結果を見ると、合計値が450(300 + 150)と400(190 + 210)の2つのドキュメントだけが返されています。合計値が660や600となる他のドキュメントは、条件「500未満」を満たしていないため除外されました。
まとめ
このように、MongoDBのアグリゲーションパイプラインで$projectと$addを組み合わせれば、複数フィールドの合計値を動的に計算し、その結果に対して$matchで条件検索を行うことができます。売上合計や在庫数の合計など、複数の数値フィールドを組み合わせた条件でドキュメントを抽出したい場合に非常に便利なテクニックです。
-
MongoDBでforループを使用して値をプッシュ(挿入)する方法
MongoDBでforループを使用して値をプッシュ(挿入)する方法MongoDBで値を繰り返しコレクションへ挿入(プッシュ)したい場合、save()メソッドとforループを組み合わせることで簡単に実現できます。ここでは、実際のコード例を交えながら手順を解説します。1. forループでドキュメントを作成するまず、forループを使ってコレクションにドキュメントを作成します。以下の例では、ループを6回まわして同じ内容のドキュメントを保存しています。> for(var v=1; v<7; v++) {... db.demo739.save({Name:Chris,SubjectName:M
-
MySQLで文字列を大文字小文字を区別して完全一致検索する方法(COLLATE活用)
MySQLで正確な文字列値(完全一致)を検索するには?MySQLでは、デフォルトの照合順序(collation)が大文字と小文字を区別しないため、WHERE Subject = MySQLのような検索では「mysql」や「MYSQL」などもヒットしてしまいます。大文字小文字まで含めて完全に一致する文字列値だけを検索したい場合は、COLLATE utf8_binを使用します。ここでは、その具体的な手順をサンプルコード付きで解説します。1. サンプルテーブルを作成するまず、検索対象となるテーブルを作成します。mysql> create table DemoTable1620-> (-&