MongoDBで配列のすべての要素が指定値より小さいドキュメントを検索する方法
MongoDBでは、配列フィールドに格納されたすべての要素が特定の値より小さい(指定した条件を満たす)ドキュメントを抽出したいケースがあります。本記事では、$not演算子と$gt演算子を組み合わせることで、この要件を実現する方法を実際のコード例とともに解説します。
1. サンプルコレクションの作成
まず、テスト用のコレクションを作成し、スコアの配列を持つドキュメントをいくつか挿入しましょう。
> 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")
}
2. 登録された全ドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> 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
]
}
3. 配列の全要素が45以下であるドキュメントを検索する
ここが本題です。配列内のすべての要素が指定した値より小さいドキュメントを取得するには、$notと$gt(greater than:より大きい)を組み合わせたクエリを使用します。これは「45より大きい要素がひとつも存在しない」ことを意味する条件になります。
> db.arrayElementsNotGreaterThanDemo.find({Scores: {$not: {$gt:45}}});
実行結果は次のとおりです。
{ "_id" : ObjectId("5cd9ea13b50a6c6dd317adb4"), "Scores" : [ 32, 33, 34, 40 ] }
結果の解説
出力を見ると、4件のドキュメントのうち1件だけがマッチしています。[89, 43, 32, 45]は89が45より大きいため除外され、[45, 56, 66, 69]や[46, 66, 77, 88]も同様に大きい値を含むため除外されました。一方、[32, 33, 34, 40]はすべての要素が45以下であるため、唯一条件を満たしたのです。
ポイントまとめ
{$not: {$gt: 値}}は「その値より大きい要素が配列内にひとつもない」という意味になる。- 単純に
{$lt: 値}だけを使うと、「少なくとも1つの要素が値より小さい」という意味になり、意図した結果にならないので注意が必要。 - 配列全体に対して条件を適用したい場合は、
$notとの組み合わせが有効なテクニック。
-
MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "
-
MySQLで4文字未満の文字列を含むすべての行を検索する方法
はじめにMySQLでは、CHAR_LENGTH()関数を使うことで、文字列の文字数を簡単に取得できます。本記事では、この関数を活用して「文字列が4文字未満」であるすべての行を検索する方法を、具体的な手順とともに解説します。ステップ1: サンプルテーブルの作成まず、CREATE TABLE文でテーブルを作成しましょう。mysql> create table DemoTable-> (-> Name varchar(100)-> );Query OK, 0 rows affected (1.38 sec)ステップ2: データの挿入続いて、INSERT文を使っていくつかのレコ