MongoDBで$projectを使って埋め込みドキュメントのisMarriedステータスをすべて取得する方法
MongoDBでドキュメント内にネストされた埋め込みドキュメント(サブドキュメント)から特定のフィールドだけを取り出したい場合、集計パイプラインの $project ステージを利用すると便利です。この記事では、「isMarried」ステータスを持つ埋め込みドキュメントから値をすべて取得する手順を、実際のコード例とともにわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、埋め込みドキュメント details を含むドキュメントをコレクションに挿入します。
> db.demo220.insertOne({
... "id":101,
... "FullName" : "John Doe",
... "EmailId" : "john12@gmail.com",
... "ShippingDate" : new ISODate(),
... "details" : { "_id" :1001, "isMarried" :true }
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3eaf5b03d395bdc213471d")
}
> db.demo220.insertOne(
...{
... "id":102,
... "FullName" : "John Smith",
... "EmailId" : "johnsmith@gmail.com",
... "ShippingDate" : new ISODate(),
... "details" : { "_id" :1002, "isMarried" :false }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3eaf5c03d395bdc213471e")
}上記のコレクションでは、各ドキュメントが details フィールドの中に _id と isMarried を持つ埋め込みドキュメントを格納しています。
2. find()メソッドで全ドキュメントを表示
挿入したデータを確認するために、find() メソッドでコレクション内のすべてのドキュメントを表示してみましょう。
> db.demo220.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3eaf5b03d395bdc213471d"), "id" : 101, "FullName" : "John Doe", "EmailId" : "john12@gmail.com", "ShippingDate" : ISODate("2020-02-08T12:53:47.876Z"), "details" : { "_id" : 1001, "isMarried" : true } }
{ "_id" : ObjectId("5e3eaf5c03d395bdc213471e"), "id" : 102, "FullName" : "John Smith", "EmailId" : "johnsmith@gmail.com", "ShippingDate" : ISODate("2020-02-08T12:53:48.991Z"), "details" : { "_id" : 1002, "isMarried" : false } }3. $projectで埋め込みドキュメントの値を抽出する
それでは、埋め込みドキュメントから isMarried の値をすべて取得するクエリを見ていきましょう。ポイントは、$project の中で ドット記法($details.isMarried) を使ってネストされたフィールドを参照することです。
> db.demo220.aggregate({ $project : {
... "isMarried" : "$details.isMarried",
... "detailsId" : "$details._id"} });このクエリを実行すると、次のように各ドキュメントの isMarried の値だけが抽出されます。
{ "_id" : ObjectId("5e3eaf5b03d395bdc213471d"), "isMarried" : true }
{ "_id" : ObjectId("5e3eaf5c03d395bdc213471e"), "isMarried" : false }まとめ
MongoDBで埋め込みドキュメントの特定フィールドを取得するには、aggregate() と $project を組み合わせるのが基本です。$details.isMarried のようにドット記法でパスを指定することで、ネストされたフィールドの値をトップレベルに引き上げて表示できます。大量のドキュメントから必要な情報だけを効率的に取り出したい場合に、ぜひ活用してください。
-
MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法
MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...
-
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。まずは、サンプルとなるコレクションとドキュメントを作成してみましょう。サンプルコレクションの作成insertOne()メソッドを使用して、ドキュメントを1件ずつ挿入します。> db.demo712.insertOne({Name:John}); { acknowledged : true, insertedId : ObjectId(5ea85f675d33e20ed1