【MongoDB】$gtと$ltで範囲の両端の数値を除外して要素を取得する方法
MongoDBで特定の範囲内のデータを取得する際、「境界となる数値そのものは除外したい」というケースはよくあります。例えば、50と60という2つの数値を基準にし、この2つの値を除いた範囲内の要素だけを取得したい場合は、比較演算子 $gt(〜より大きい)と $lt(〜より小さい)を組み合わせます。
両端の数値を除外する基本構文
境界値が50と60であると仮定した場合、以下の構文で範囲内のドキュメントを取得できます。
db.yourCollectionName.find({yourFieldName: { $gt : 50 , $lt : 60 } } );両端の数値も含めたい場合
逆に、50と60自体も結果に含めたいときは、$gte(以上)と $lte(以下)を使用します。
db.yourCollectionName.find({yourFieldName: { $gte : 50 , $lte : 60 } } );サンプルコレクションの作成
動作を確認するため、まずテスト用のコレクションに複数のドキュメントを挿入しましょう。
> db.returnEverythingBetween50And60.insertOne({"Amount":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c42eedc6604c74817cdb")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c432edc6604c74817cdc")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c436edc6604c74817cdd")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":59});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c43aedc6604c74817cde")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c43eedc6604c74817cdf")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":49});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c442edc6604c74817ce0")
}
> db.returnEverythingBetween50And60.insertOne({"Amount":71});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3c445edc6604c74817ce1")
}登録済みドキュメントの一覧を確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.returnEverythingBetween50And60.find().pretty();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5cd3c42eedc6604c74817cdb"), "Amount" : 55 }
{ "_id" : ObjectId("5cd3c432edc6604c74817cdc"), "Amount" : 45 }
{ "_id" : ObjectId("5cd3c436edc6604c74817cdd"), "Amount" : 50 }
{ "_id" : ObjectId("5cd3c43aedc6604c74817cde"), "Amount" : 59 }
{ "_id" : ObjectId("5cd3c43eedc6604c74817cdf"), "Amount" : 60 }
{ "_id" : ObjectId("5cd3c442edc6604c74817ce0"), "Amount" : 49 }
{ "_id" : ObjectId("5cd3c445edc6604c74817ce1"), "Amount" : 71 }50と60を除外した範囲検索の実行
ここで本題のクエリです。50と60の両方を除外し、その間にあるドキュメントだけを返すには次のように記述します。
> db.returnEverythingBetween50And60.find({Amount: { $gt : 50 , $lt : 60 } } );実行結果は以下の通りです。
{ "_id" : ObjectId("5cd3c42eedc6604c74817cdb"), "Amount" : 55 }
{ "_id" : ObjectId("5cd3c43aedc6604c74817cde"), "Amount" : 59 }結果のポイント
出力には Amount が 55 と 59 の2件だけが含まれています。50 は「$gt(より大きい)」の条件を満たさず、60 は「$lt(より小さい)」の条件を満たさないため、どちらも除外されました。また、範囲外の 45・49・71 も当然ながら結果には現れません。このように $gt と $lt を併用すれば、両端を含まない「開区間」での範囲検索がシンプルに実現できます。両端を含めたい場合は、前述の $gte/$lte に置き換えるだけで対応可能です。
-
MySQLでBETWEEN句を使わずに範囲内の値を取得する方法:AND演算子による代替手段
BETWEEN句の代替としてAND演算子を使用する MySQLでは、特定の範囲内の値を取得する際に一般的にBETWEEN句が使われますが、実はAND演算子を組み合わせた比較条件でも同じ結果を得ることができます。この記事では、BETWEEN句を使わずに範囲検索を行う具体的な手順を解説します。 1. サンプルテーブルを作成する まず、数値を格納するためのシンプルなテーブルを作成しましょう。 mysql> create table DemoTable ( Number int ); Query OK, 0 rows affected (0.62 sec) 2. テストデータを挿入す
-
C++で[0, n]の範囲にセットビットがちょうど1つだけある数の個数を求める方法
問題概要ある整数が与えられたとき、0からその数までの範囲(0〜num)に含まれる「セットビットがちょうど1つだけ」の数の個数を求めるのが本記事のテーマです。セットビットとは、2進数表現において「1」となっているビットのことです。整数値を2進数に変換すると、必ず0と1の組み合わせで表されます。コンピュータの分野では、この「1」のことをセットビットと呼びます。入力例・出力例入力: int num = 15出力: [0, 15] の範囲でセットビットが1つだけある数の個数は 4解説: 与えられた数は15なので、対象となる範囲は0〜15です。各数値を4桁の2進数で表すと次のようになります。0 → 0