MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。
> db.demo761.insertOne(
... {
... "details": [
... {
... "student": {
... "FullName": "Chris Brown"
... }
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb034d15637cd592b2a4af1")
}
> db.demo761.insertOne(
... {
... "details": [
... {
... "student": {
... "FullName": "Chris Taylor"
... }
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb034d25637cd592b2a4af2")
}
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo761.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5eb034d15637cd592b2a4af1"), "details" : [ { "student" : { "FullName" : "Chris Brown" } } ] }
{ "_id" : ObjectId("5eb034d25637cd592b2a4af2"), "details" : [ { "student" : { "FullName" : "Chris Taylor" } } ] }
MongoDBで配列をクエリする手順
以下は、MongoDBで配列内の特定の値をクエリして取得する方法です。
> db.demo761.aggregate([
... {'$unwind':'$details'},
... {'$match': {
... 'details.student.FullName':'Chris Taylor',
... }},
... {'$project': {
... 'details.student.FullName': 1, '_id': 0
... }},
... ])
このクエリを実行すると、次の出力が得られます。
{ "details" : { "student" : { "FullName" : "Chris Taylor" } } }
各パイプラインステージの解説
- $unwind:details配列を展開し、各要素を個別のドキュメントとして扱えるようにします。
- $match:条件に一致するドキュメントだけをフィルタリングします。ここでは「Chris Taylor」という氏名を持つ学生を抽出しています。
- $project:出力するフィールドを制御します。details.student.FullNameを表示対象(1)とし、_idは非表示(0)に設定しています。
このように、$unwindで配列を展開した後に$matchで絞り込み、$projectで必要なフィールドだけを出力することで、ネストされた配列の中から目的の値を効率的に取得できます。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで特定の値より大きい配列要素を持つドキュメントを照会する方法($elemMatch活用)
MongoDBで配列内の値を条件に照合するにはMongoDBでは、$elemMatch 演算子を使用することで、指定したすべてのクエリ条件に一致する要素が少なくとも1つ含まれる配列フィールドを持つドキュメントを照合できます。ここでは、配列内の値が特定の値より大きいドキュメントを検索する方法を、具体的なサンプルコードとともに解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo701.insertOne({ListOfValues:[100,200,300]}); { acknowledged : true, ins