MongoDBの基準オブジェクトで2つの外部値が等しいかどうかをテストする方法
MongoDBの基準(クエリ)オブジェクトの中で、外部で定義した2つの値が等しいかどうかを判定したい場合は、$type演算子を利用します。mongoシェルでは「v1 === v2」のような比較式は true または false を返し、数値計算に使うとそれぞれ 1・0 として扱われます。この性質を応用すれば、比較結果に応じて $type の指定値を動的に変化させることができます。
ここからは、実際にコレクションを作成しながら具体的な手順を確認していきましょう。
手順1:コレクションとドキュメントを作成する
まず insertOne() メソッドを使って、サンプル用のコレクション demo211 にドキュメントを挿入します。1件目は Name フィールドが文字列、2件目は null のドキュメントです。
> db.demo211.insertOne({id:101,"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3e298203d395bdc21346fa")
}
> db.demo211.insertOne({id:102,"Name":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3e2a5403d395bdc21346fb")
}手順2:find()メソッドですべてのドキュメントを表示する
続いて、find() メソッドでコレクション内の全ドキュメントを表示して内容を確認します。
> db.demo211.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3e298203d395bdc21346fa"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5e3e2a5403d395bdc21346fb"), "id" : 102, "Name" : null }手順3:2つの外部値が等しいかどうかをテストするクエリ
以下が、MongoDBの基準オブジェクト内で2つの外部値が等しいかどうかをテストするクエリです。
> v1=200;
200
> v2=200;
200
> db.demo211.find({Name : 'Chris', Name : { $type : 1 + (v1 === v2) }});このクエリを実行すると、次の出力が得られます。
{ "_id" : ObjectId("5e3e298203d395bdc21346fa"), "id" : 101, "Name" : "Chris" }$typeによる判定の仕組み
このクエリのポイントは「$type : 1 + (v1 === v2)」という部分です。v1 と v2 にはどちらも 200 が代入されているため、「v1 === v2」は true を返します。true は数値コンテキストでは 1 として評価されるため、式全体の値は「1 + 1 = 2」になります。
参考までに、主なBSON型と $type の対応は以下の通りです。
- $type : 1 → double(倍精度浮動小数点数)
- $type : 2 → string(文字列)
- $type : 10 → null
つまり、2つの値が等しければ $type : 2(文字列型)となり、Name フィールドが文字列である "Chris" のドキュメントが一致します。逆に v1 と v2 が異なる値であれば、式の結果は 1(double型)になるため、文字列やnullのフィールドには一致せず、該当ドキュメントは0件となります。
今回の実行結果では Name が "Chris" のドキュメントだけが返されていることから、2つの外部値(v1 と v2)が等しいと正しく判定できたことがわかります。このテクニックを使えば、アプリケーション側の変数同士の一致を、クエリ条件の一部として簡潔に表現できます。
-
MongoDBで2階層の深さにネストされたレコードを検索する方法
MongoDBで2階層の深さにネストされたフィールドを持つレコードを検索したい場合、$where 演算子とJavaScript関数を組み合わせることで実現できます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。サンプルコレクションの作成まず、検索対象となるドキュメントを含むコレクションを作成します。ここでは「FirstPosition」と「SecondPosition」という2つのネストされたオブジェクトを持つドキュメントを挿入します。> db.demo468.insertOne( ... { ... _id : new ObjectId(), ... F
-
null値が含まれる場合、MongoDBでORDER BY(ソート)を実行する方法
ドキュメントの中にnull値が含まれている場合でも、sort()メソッドを使うことで、SQLのORDER BYに相当するソート処理を実現できます。$orderby演算子は非推奨注意: MongoDB v3.2以降、mongoシェルにおける$orderby演算子は非推奨(deprecated)となりました。今後はcursor.sort()を使用することが推奨されています。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo530.insertOne({"Name":"Chris"});{ "