MongoDBで配列から特定のフィールドを返すクエリの書き方
MongoDBで配列から特定のフィールドを返す方法
配列の中から特定のフィールドだけを取り出して返したい場合は、集計フレームワーク(aggregate)の $project を使用します。この記事では、実際にコレクションを作成しながら、具体的な手順をわかりやすく解説していきます。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。以下のコマンドを実行します。
> db.returnSpecificFieldDemo.insertOne(
{
"StudentId":1,
"StudentDetails": [
{
"StudentName":"Larry",
"StudentAge":21,
"StudentCountryName":"US"
},
{
"StudentName":"Chris",
"StudentAge":23,
"StudentCountryName":"AUS"
}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce23d3236e8b255a5eee943")
}2. 登録したドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.returnSpecificFieldDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5ce23d3236e8b255a5eee943"),
"StudentId" : 1,
"StudentDetails" : [
{
"StudentName" : "Larry",
"StudentAge" : 21,
"StudentCountryName" : "US"
},
{
"StudentName" : "Chris",
"StudentAge" : 23,
"StudentCountryName" : "AUS"
}
]
}3. 配列から特定のフィールドを返すクエリ
ここからが本題です。配列(StudentDetails)の中から特定のフィールド(StudentCountryName)だけを取り出すには、$project と $arrayElemAt を組み合わせます。
> db.returnSpecificFieldDemo.aggregate([{$project:{_id:0, StudentId:'$StudentId', StudentCountryName:{ $arrayElemAt: ['$StudentDetails.StudentCountryName',1] }}}]);実行すると、次のように StudentId と、指定した位置の StudentCountryName のみが返されます。
{ "StudentId" : 1, "StudentCountryName" : "AUS" }ポイント解説
- $project: 出力に含めるフィールドを指定するステージです。
_id: 0とすることで、デフォルトで表示される _id フィールドを非表示にできます。 - $arrayElemAt: 配列とインデックス番号を指定し、その位置にある要素を取得する演算子です。インデックスは0から始まるため、上記の例では「1」を指定することで配列の2番目の要素(Chrisの国名「AUS」)が取得されています。
このように aggregate の $project を活用すれば、ネストされた配列から必要なフィールドだけを効率的に抽出できます。データ量が多いコレクションを扱う際や、APIレスポンスを整形したい場合に特に役立つテクニックなので、ぜひ覚えておきましょう。
-
MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方
MongoDBで配列フィールドを完全に削除するにはMongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。1. サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "