【MongoDB】$where演算子で2つのフィールド同士を比較する方法
MongoDBで2つのフィールドを比較するには?
MongoDBでは、$where演算子をfind()メソッドと組み合わせることで、同じドキュメント内に存在する2つのフィールド同士を比較できます。通常の検索条件では「フィールドと特定の値」の比較しか行えませんが、$whereを使えばJavaScriptの式によって「フィールドとフィールド」を直接比較できるのが大きな特徴です。
基本構文
db.yourCollectionName.find({$where:"yourCondition"}).pretty();
サンプル用コレクションの作成
それでは、上記の構文の動作を実際に確認してみましょう。まずは「compareTwoFields」というコレクションを作成し、複数のドキュメントを挿入します。
> db.compareTwoFields.insert({"Id":1,"FullName":{"FirstName":"John","LastName":"Smith"},"BranchName":"ComputerScience"});
WriteResult({ "nInserted" : 1 })
> db.compareTwoFields.insert({"Id":2,"FullName":{"FirstName":"Smith","LastName":"Smith"},"BranchName":"Civil"});
WriteResult({ "nInserted" : 1 })
> db.compareTwoFields.insert({"Id":3,"FullName":{"FirstName":"David","LastName":"Smith"},"BranchName":"Mechanical"});
WriteResult({ "nInserted" : 1 })
※なお、最近のバージョンのMongoDBでは insert() の代わりに insertOne() や insertMany() の使用が推奨されています。
登録したドキュメントの確認
find()メソッドを使えば、コレクション内のすべてのドキュメントを表示できます。
> db.compareTwoFields.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5c6c237568174aae23f5ef64"),
"Id" : 1,
"FullName" : {
"FirstName" : "John",
"LastName" : "Smith"
},
"BranchName" : "ComputerScience"
}
{
"_id" : ObjectId("5c6c239868174aae23f5ef65"),
"Id" : 2,
"FullName" : {
"FirstName" : "Smith",
"LastName" : "Smith"
},
"BranchName" : "Civil"
}
{
"_id" : ObjectId("5c6c23b468174aae23f5ef66"),
"Id" : 3,
"FullName" : {
"FirstName" : "David",
"LastName" : "Smith"
},
"BranchName" : "Mechanical"
}
2つのフィールドを比較するクエリの実行
ここでは、ネストされたフィールドである FullName.FirstName(名)と FullName.LastName(姓)が一致しているドキュメントのみを抽出してみます。
> db.compareTwoFields.find({$where:"this.FullName.FirstName==this.FullName.LastName"}).pretty();
実行すると、名と姓がどちらも「Smith」である Id=2 のドキュメントだけが取得できます。
{
"_id" : ObjectId("5c6c239868174aae23f5ef65"),
"Id" : 2,
"FullName" : {
"FirstName" : "Smith",
"LastName" : "Smith"
},
"BranchName" : "Civil"
}
補足:$expr演算子というより効率的な選択肢
$whereはドキュメントごとにJavaScriptを実行する仕組みのため、インデックスを活用できず、大量データを扱う場合はパフォーマンスが低下しやすい点に注意が必要です。MongoDB 3.6以降では、集計式を使用できる $expr演算子 が公式に推奨されており、次のように同じ結果を得られます。
> db.compareTwoFields.find(
{ $expr: { $eq: ["$FullName.FirstName", "$FullName.LastName"] } }
).pretty();
用途やデータ量に応じて、$whereと$exprを使い分けることで、より効率的なクエリを実現できます。
-
MongoDBでサブドキュメントの条件を使ってドキュメントをクエリする方法
はじめに MongoDBでは、配列内に格納されたサブドキュメント(ネストされたドキュメント)の特定のフィールドを条件として、親ドキュメントを検索したいケースがよくあります。本記事では、$expr、$let、$arrayElemAt を組み合わせることで、配列の最後の要素など特定のサブドキュメントに対して条件を指定し、ドキュメントをクエリする方法を解説します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成します。ここでは details という配列フィールドを持ち、その中に開始日(startDate)と終了日(endDate)を含む複数のサブドキュメントが格納されたド
-
MongoDBで複数フィールドの存在を確認するクエリの書き方($existsと$andの活用)
MongoDBで複数のフィールドの存在を確認する方法MongoDBでは、ドキュメント内に特定の複数のフィールドがすべて存在するかどうかを確認したいケースがよくあります。そのような場合には、$exists 演算子と $and 演算子を組み合わせて使用します。この記事では、実際にコレクションを作成しながら、複数フィールドの存在をチェックするクエリの書き方を具体的に解説します。1. サンプルコレクションとドキュメントの作成まず、insertOne() メソッドを使って、コレクション demo475 にドキュメントを挿入していきます。> db.demo475.insertOne({Student