MongoDBで$elemMatch演算子を使わずに配列の完全一致を検索する方法
MongoDBで配列フィールドが「配列全体として」完全に一致するドキュメントを検索したい場合、$elemMatch演算子を使わなくても、$eq演算子で簡単に実現できます。$elemMatchは配列内の要素に対する複雑な条件マッチングに便利ですが、配列そのものとの一致を確認するだけであれば、$eqの方がシンプルで直感的です。
サンプルコレクションの作成
まず、insertOne()メソッドを使って、テスト用のドキュメントを含むコレクションを作成しましょう。
> db.equalDemo.insertOne({_id:1,"StudentFriendNames":["John","Carol","Sam"]});
{ "acknowledged" : true, "insertedId" : 1 }
> db.equalDemo.insertOne({_id:2,"StudentFriendNames":null});
{ "acknowledged" : true, "insertedId" : 2 }
> db.equalDemo.insertOne({_id:3,"StudentFriendNames":["Carol"]});
{ "acknowledged" : true, "insertedId" : 3 }
> db.equalDemo.insertOne({_id:4,"StudentFriendNames":["Sam"]});
{ "acknowledged" : true, "insertedId" : 4 }登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.equalDemo.find();
実行すると、以下のような出力が得られます。
{ "_id" : 1, "StudentFriendNames" : [ "John", "Carol", "Sam" ] }
{ "_id" : 2, "StudentFriendNames" : null }
{ "_id" : 3, "StudentFriendNames" : [ "Carol" ] }
{ "_id" : 4, "StudentFriendNames" : [ "Sam" ] }$eq演算子で完全一致を検索する
配列 ["Carol"] と完全に一致するドキュメントを取得するには、次のように$eq演算子を指定します。
> db.equalDemo.find({"StudentFriendNames":{$eq:["Carol"]}});実行結果は以下の通りです。
{ "_id" : 3, "StudentFriendNames" : [ "Carol" ] }このクエリでは、配列の要素の1つとして「Carol」を含むドキュメント(_id: 1 など)はマッチせず、フィールドの値が配列 ["Carol"] そのものと完全に一致するドキュメント(_id: 3)のみが返されます。このように、$eq演算子を使えば$elemMatchなしでも配列の完全一致検索が可能です。
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で
-
C#でsizeofを使わずに変数のサイズを取得する方法
はじめにC#では、通常、変数のサイズ(バイト数)を取得するには sizeof 演算子を使用します。int x; x = sizeof(int);しかし、sizeof を使わずに変数のサイズを取得したい場合もあります。そのようなときは、BitConverter.GetBytes メソッドを利用するのが便利です。このメソッドは指定した値をバイト配列に変換してくれるため、その配列の長さ(Length プロパティ)を調べることで、変数のサイズを求めることができます。// sizeofを使わない方法 byte[] dataBytes = BitConverter.GetBytes(x); int d =