MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

【MongoDB】$where演算子で請求先住所と配送先住所が一致するドキュメントを検索する方法

MongoDBでは、同一ドキュメント内の異なるフィールド同士を比較したい場面があります。たとえば、請求先住所(billingAddress)配送先住所(deliveryAddress)が一致しているレコードだけを取り出したいケースです。このような比較には、$where演算子を使用します。以下、具体的な手順をサンプルコード付きで解説します。

サンプルコレクションの作成

まず、テスト用のコレクションに複数のドキュメントを挿入します。

> db.demo589.insertOne({deliveryAddress:"US",billingAddress:"UK"});{
   "acknowledged" : true, "insertedId" : ObjectId("5e92c117fd2d90c177b5bccc")
}
> db.demo589.insertOne({deliveryAddress:"US",billingAddress:"US"});{
   "acknowledged" : true, "insertedId" : ObjectId("5e92c11bfd2d90c177b5bccd")
}
> db.demo589.insertOne({deliveryAddress:"US",billingAddress:"AUS"});{
   "acknowledged" : true, "insertedId" : ObjectId("5e92c11ffd2d90c177b5bcce")
}
> db.demo589.insertOne({deliveryAddress:"UK",billingAddress:"US"});{
   "acknowledged" : true, "insertedId" : ObjectId("5e92c127fd2d90c177b5bccf")
}

登録済みの全ドキュメントを確認する

find()メソッドを使うと、コレクション内のすべてのドキュメントを一覧表示できます。

> db.demo589.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e92c117fd2d90c177b5bccc"), "deliveryAddress" : "US", "billingAddress" : "UK" }
{ "_id" : ObjectId("5e92c11bfd2d90c177b5bccd"), "deliveryAddress" : "US", "billingAddress" : "US" }
{ "_id" : ObjectId("5e92c11ffd2d90c177b5bcce"), "deliveryAddress" : "US", "billingAddress" : "AUS" }
{ "_id" : ObjectId("5e92c127fd2d90c177b5bccf"), "deliveryAddress" : "UK", "billingAddress" : "US" }

billingAddressとdeliveryAddressが一致するドキュメントを検索する

請求先住所が配送先住所と等しいドキュメントを取得するには、$whereにJavaScriptの比較式を渡します。thisは現在処理中のドキュメント自身を表します。

> db.demo589.find( { $where: "this.deliveryAddress == this.billingAddress" } );

このクエリを実行すると、両方の住所が「US」で一致している1件のドキュメントのみが返されます。

{ "_id" : ObjectId("5e92c11bfd2d90c177b5bccd"), "deliveryAddress" : "US", "billingAddress" : "US" }

補足:パフォーマンスを重視するなら$exprも有効

$whereは各ドキュメントに対してJavaScriptを実行する仕組みのため、件数の多いコレクションでは処理速度が低下しがちです。MongoDB 3.6以降を利用している場合は、JavaScriptを介さずに集計式でフィールド同士を比較できる$expr演算子の使用を検討するとよいでしょう。

> db.demo589.find( { $expr: { $eq: [ "$deliveryAddress", "$billingAddress" ] } } );

どちらの方法でも同じ結果が得られますが、大量データを扱う本番環境では、オーバーヘッドの少ない$exprの方が有利です。用途やデータ規模に応じて使い分けましょう。

  1. 特定のFirstNameとLastNameを持つドキュメントを検索するMongoDBクエリの書き方

    はじめにMongoDBで特定のFirstNameとLastNameを持つドキュメントを検索するには、$and演算子と$in演算子を組み合わせて使用します。この記事では、実際のコード例を通して、find()メソッドでこの条件を実装する方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。> db.demo692.insertOne({FirstName:"Chris","LastName":"Brown"}); { "acknowl

  2. MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法

    MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...