$out
1. $out ステージの基本機能
このアグリゲーションステージは、アグリゲーションパイプラインから返された最終的なドキュメントを、指定したコレクションに書き込みます。
通常、アグリゲーションの結果はメモリ上の一時的な出力として返されますが、$out を使用することで、その結果をデータベース内に物理的なデータとして永続化できます。
重要なルール:$out ステージは、アグリゲーションパイプラインの最後(末尾)のステージである必要があります。
2. 実装例:物件タイプ別の集計結果を保存する
以下の例では、「アグリゲーション入門」セクションでロードしたサンプルデータセットの中から、sample_airbnb データベースを使用します。
物件をタイプ別にグループ化し、その結果を properties_by_type という新しいコレクションに保存してみましょう。
2.1 コード例
db.listingsAndReviews.aggregate([
{
// ステージ 1: property_type でグループ化し、各物件の詳細を配列にプッシュする
$group: {
_id: "$property_type",
properties: {
$push: {
name: "$name",
accommodates: "$accommodates", // 収容人数
price: "$price", // 価格
},
},
},
},
{
// ステージ 2: 結果を "properties_by_type" コレクションに書き出す
$out: "properties_by_type"
}
])3. 処理の詳細解説
- 第 1 ステージ (
$group): 物件をproperty_type(一戸建て、アパートなど)ごとにグループ化します。その際、各グループ内の各物件について、name、accommodates、priceフィールドを含む新しいオブジェクトを作成し、properties 配列に追加します。 - 第 2 ステージ (
$out): 現在のデータベース内にproperties_by_typeという名前の新しいコレクションを作成し、集計結果のドキュメントをすべてそのコレクションに書き込みます。