MongoDBで配列に特定の値が含まれるかを判定し、true/falseのブールフィールドを追加する方法
MongoDBでは、配列内に特定の値が存在するかどうかを判定し、その結果に応じて true または false のブール型フィールドを返されたオブジェクトに追加できます。この処理には、集計パイプライン(aggregate)と $ifNull 演算子を使用します。
$ifNull は式を評価し、その式がnull以外の値に評価された場合には式の値をそのまま返します。nullや未定義の場合には代替値を返すため、配列フィールドを持たないドキュメントが混在していても、エラーを発生させずに安全に処理できるのが特徴です。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo542.insertOne({"ListOfName":["Chris","David"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8cabc6ef4dcbee04fbbc17")
}
> db.demo542.insertOne({"ListOfName":null});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8cabc8ef4dcbee04fbbc18")
}
> db.demo542.insertOne({"ListOfName":["David"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8cabd3ef4dcbee04fbbc19")
}
> db.demo542.insertOne({"Name":"John"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8cabdaef4dcbee04fbbc1a")
}上記のコレクションには、「ListOfName」という配列フィールドを持つドキュメント、nullを持つドキュメント、そして配列フィールド自体が存在しないドキュメントという、さまざまなケースが含まれています。
作成したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo542.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e8cabc6ef4dcbee04fbbc17"), "ListOfName" : [ "Chris", "David" ] }
{ "_id" : ObjectId("5e8cabc8ef4dcbee04fbbc18"), "ListOfName" : null }
{ "_id" : ObjectId("5e8cabd3ef4dcbee04fbbc19"), "ListOfName" : [ "David" ] }
{ "_id" : ObjectId("5e8cabdaef4dcbee04fbbc1a"), "Name" : "John" }特定の値が配列に含まれているか判定するクエリ
次のクエリでは、変数 id に設定した値(ここでは「David」)が配列内に存在するかどうかを判定し、結果を「matched」というブール型フィールドとして出力します。
> var id = "David";
> db.demo542.aggregate([
... {
... "$project": {
... "matched": {
... "$eq": [
... {
... "$size": {
... "$ifNull": [
... { "$setIntersection": [ "$ListOfName", [id] ] },
... []
... ]
... }
... },
... 1
... ]
... }
... }
... }
... ])クエリの仕組み
このクエリは、以下のステップで動作します。
- $setIntersection: フィールド「ListOfName」の配列と検索対象の値(
[id])の共通要素(積集合)を計算します。値が存在すれば、その値を含む配列が返されます。 - $ifNull: フィールドがnullまたは存在しない場合に空の配列(
[])を返し、後続の処理でエラーが発生しないようにします。 - $size: 積集合の結果の配列から要素数を取得します。
- $eq: 要素数が1(つまり一致する値が配列内に存在する)かどうかを比較し、
trueまたはfalseを返します。
実行結果
クエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e8cabc6ef4dcbee04fbbc17"), "matched" : true }
{ "_id" : ObjectId("5e8cabc8ef4dcbee04fbbc18"), "matched" : false }
{ "_id" : ObjectId("5e8cabd3ef4dcbee04fbbc19"), "matched" : true }
{ "_id" : ObjectId("5e8cabdaef4dcbee04fbbc1a"), "matched" : false }結果を見ると、「David」を含む配列を持つドキュメントには true が設定され、nullが格納されているドキュメントや配列フィールド自体が存在しないドキュメントには false が設定されていることがわかります。$ifNull を組み合わせることで、データの形状が不揃いなコレクションでも安定した判定処理を実現できます。
-
C#でBitArrayのすべてのビットを指定した値に一括設定する方法
C#の BitArray クラスには、配列内のすべてのビットをまとめて指定した値に設定できる SetAll() メソッドが用意されています。引数に true を渡せば全ビットが true に、false を渡せば全ビットが false に一括で変更されます。SetAll() メソッドの構文public void SetAll(bool value);例1:すべてのビットを true に設定するまず、5つの要素を持つBitArrayを作成し、複数のビットを false に設定した後、SetAll(true) を呼び出して全ビットを true に変更する例を見てみましょう。using System
-
Javaでboolean配列を初期化する方法をわかりやすく解説
Javaにおけるboolean配列は、boolean型の値のみを格納できる配列です。boolean配列のデフォルト値(初期値)はfalseであり、配列を作成した時点で、すべての要素が自動的にfalseで初期化されます。一方、参照型(クラス型)の配列の場合は、nullで初期化される点に注意が必要です。 実際の開発では、「配列のすべての要素をtrueまたはfalseで明示的に初期化したい」というケースがよくあります。そのような場合には、Arrays.fill()メソッドを使うと、1行のコードで全要素をまとめて初期化できて便利です。 boolean配列の宣言構文 boolean[] booleanA