MongoDBで配列の全要素が指定値より大きいドキュメントを検索するクエリ
MongoDBで配列フィールドの要素を指定した値と比較してドキュメントを検索するには、$gt(greater than/より大きい)演算子を使用します。ここでは、サンプルコレクションを作成しながら、実際の動作を順番に確認していきます。
サンプルコレクションの作成
まず、insertOne()メソッドを使って、数値の配列「Scores」を持つドキュメントを4件登録します。
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[89,43,32,45]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9e9f9b50a6c6dd317adb3")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[32,33,34,40]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9ea13b50a6c6dd317adb4")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[45,56,66,69]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9ea25b50a6c6dd317adb5")
}
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[46,66,77,88]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd9ea3cb50a6c6dd317adb6")
}
登録されたドキュメントの確認
find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを整形された形式で表示できます。
> db.arrayElementsNotGreaterThanDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cd9e9f9b50a6c6dd317adb3"),
"Scores" : [
89,
43,
32,
45
]
}
{
"_id" : ObjectId("5cd9ea13b50a6c6dd317adb4"),
"Scores" : [
32,
33,
34,
40
]
}
{
"_id" : ObjectId("5cd9ea25b50a6c6dd317adb5"),
"Scores" : [
45,
56,
66,
69
]
}
{
"_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"),
"Scores" : [
46,
66,
77,
88
]
}
$gt演算子を使った検索クエリ
次のクエリでは、Scoresフィールドに$gt演算子を適用し、45より大きい値を含むドキュメントを検索します。
> db.arrayElementsNotGreaterThanDemo.find({Scores: {$gt:45}});
実行結果は次のとおりです。
{ "_id" : ObjectId("5cd9e9f9b50a6c6dd317adb3"), "Scores" : [ 89, 43, 32, 45 ] }
{ "_id" : ObjectId("5cd9ea25b50a6c6dd317adb5"), "Scores" : [ 45, 56, 66, 69 ] }
{ "_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"), "Scores" : [ 46, 66, 77, 88 ] }
注意点:$gtは配列内の1つの要素でも一致すればマッチする
配列フィールドに直接$gtを指定した場合、配列内の少なくとも1つの要素が条件を満たしていれば、そのドキュメント全体がマッチします。上記の出力を見ると、[89, 43, 32, 45]のように45以下の要素を含むドキュメントも結果に含まれていることが分かります。
すべての要素が条件より大きいドキュメントだけを取得するには
「配列のすべての要素が45より大きい」という条件を厳密に適用したい場合は、$notと$lte(less than or equal/以下)を組み合わせる方法が有効です。これにより、「45以下の要素を1つも含まない」ドキュメント、すなわち全要素が45より大きいドキュメントだけを抽出できます。
> db.arrayElementsNotGreaterThanDemo.find({Scores: {$not: {$lte: 45}}});
この場合、サンプルデータの中で条件を満たすのは[46, 66, 77, 88]の1件だけです。用途に応じて、$gt単体のクエリと$not+$lteの組み合わせを使い分けるとよいでしょう。
-
MongoDBで特定の値より大きい配列要素を持つドキュメントを照会する方法($elemMatch活用)
MongoDBで配列内の値を条件に照合するにはMongoDBでは、$elemMatch 演算子を使用することで、指定したすべてのクエリ条件に一致する要素が少なくとも1つ含まれる配列フィールドを持つドキュメントを照合できます。ここでは、配列内の値が特定の値より大きいドキュメントを検索する方法を、具体的なサンプルコードとともに解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo701.insertOne({ListOfValues:[100,200,300]}); { acknowledged : true, ins
-
Pythonのfilter()関数でリスト内のxより小さい値をすべて抽出する方法
数値のリスト nums と、もうひとつの数値 x が与えられたとします。このとき、nums の中から x より小さい値だけをフィルタリングして取り出す方法を解説します。Pythonには filter() という組み込み関数があり、引数として関数を受け取り、その関数の条件に合う要素だけを抽出できます。これを使えば、簡潔なコードで目的の処理を実現できます。問題の例たとえば、入力が次のような場合を考えてみましょう。nums = [1,5,8,3,6,9,12,77,55,36,2,5,6,12,87] x = 50この場合、50より小さい値だけが残るため、出力は次のようになります。[1, 5, 8,