フィルタリングされたサブセット
項目一覧
はじめに
このチュートリアルでは、Node.js ドライバーを使用して集計パイプラインを構築し、コレクションに対して集計を実行し、サンプル アプリを完了して実行して結果を出力する方法を学習できます。 この集計では、次の操作が実行されます。
フィールド値でドキュメントのサブセットと一致
結果ドキュメントの形式
Tip
クエリ API を使用して、コレクション内のドキュメントのサブセットをクエリすることもできます。 クエリを指定する方法については、 読み取り操作 のガイドを参照してください。
集計タスクの概要
このチュートリアルでは、コレクション内のドキュメントの特定のサブセットをコレクション内でクエリする方法を説明します。 結果には、エンジニアである 3 人の末尾を説明するドキュメントが含まれています。
この例では、人物を説明するドキュメントを含む 1 つのコレクション persons
を使用しています。 各ドキュメントには、名前、誕生日、投票、その他の詳細が含まれています。
始める前に
このチュートリアルを開始する前に、集計テンプレート アプリの手順 を完了して、動作する Node.js アプリケーションを設定してください。
アプリを設定したら、次のコードをアプリケーションに追加してpersons
コレクションにアクセスします。
const personColl = aggDB.collection("persons");
次のコードに示すように、コレクション内の既存のデータをすべて削除し、 persons
コレクションにサンプル データを挿入します。
await personColl.deleteMany({}); const personData = [ { person_id: "6392529400", firstname: "Elise", lastname: "Smith", dateofbirth: new Date("1972-01-13T09:32:07Z"), vocation: "ENGINEER", address: { number: 5625, street: "Tipa Circle", city: "Wojzinmoj", }, }, { person_id: "1723338115", firstname: "Olive", lastname: "Ranieri", dateofbirth: new Date("1985-05-12T23:14:30Z"), gender: "FEMALE", vocation: "ENGINEER", address: { number: 9303, street: "Mele Circle", city: "Tobihbo", }, }, { person_id: "8732762874", firstname: "Toni", lastname: "Jones", dateofbirth: new Date("1991-11-23T16:53:56Z"), vocation: "POLITICIAN", address: { number: 1, street: "High Street", city: "Upper Abbeywoodington", }, }, { person_id: "7363629563", firstname: "Bert", lastname: "Gooding", dateofbirth: new Date("1941-04-07T22:11:52Z"), vocation: "FLORIST", address: { number: 13, street: "Upper Bold Road", city: "Redringtonville", }, }, { person_id: "1029648329", firstname: "Sophie", lastname: "Celements", dateofbirth: new Date("1959-07-06T17:35:45Z"), vocation: "ENGINEER", address: { number: 5, street: "Innings Close", city: "Basilbridge", }, }, { person_id: "7363626383", firstname: "Carl", lastname: "Simmons", dateofbirth: new Date("1998-12-26T13:13:55Z"), vocation: "ENGINEER", address: { number: 187, street: "Hillside Road", city: "Kenningford", }, }, ]; await personColl.insertMany(personData);
Tutorial
エンジニアのマッチングステージを追加する
まず、 vocation
フィールドの値が"ENGINEER"
であるドキュメントを検索する $matchステージを追加します。
pipeline.push({ $match: { "vocation": "ENGINEER" }, });
最も小さいものから最も古い順に並べ替えるためのソートステージを追加します
次に、ドキュメントをdateofbirth
フィールドで降順にソートする$sortステージを追加して、最も小さいユーザーを最初にリストします。
pipeline.push({ $sort: { "dateofbirth": -1, } });
3 つの結果のみを表示するには制限ステージを追加します
次に、パイプラインに$limitステージを追加して、結果の最初の 3 つのドキュメントのみを出力します。
pipeline.push({ $limit: 3 });
不要なフィールドを削除するために設定されていない ステージを追加します
最後に、 $unsetステージを追加します。 $unset
ステージは、結果ドキュメントから不要なフィールドを排除します。
pipeline.push({ $unset: [ "_id", "address", ] });
Tip
異なるフィールドを持つドキュメントがコレクションに追加される場合に集計パイプラインが変更されないようにするには、 $project
ではなく$unset
演算子を使用します。
結果の解釈
集計された結果には 3 つのドキュメントが含まれます。 ドキュメントは、 "ENGINEER"
の呼び出しを持つ最年数の 3 人を、最も小さいものから最も古いものの順に表します。 _id
結果では、address
フィールドと フィールドは省略されます。
{ person_id: '7363626383', firstname: 'Carl', lastname: 'Simmons', dateofbirth: 1998-12-26T13:13:55.000Z, vocation: 'ENGINEER' } { person_id: '1723338115', firstname: 'Olive', lastname: 'Ranieri', dateofbirth: 1985-05-12T23:14:30.000Z, gender: 'FEMALE', vocation: 'ENGINEER' } { person_id: '6392529400', firstname: 'Elise', lastname: 'Smith', dateofbirth: 1972-01-13T09:32:07.000Z, vocation: 'ENGINEER' }
このチュートリアルの完全なコードを表示するには、 Githubの 完了したフィルタリング サブセット アプリGithub を参照してください。