Docs Menu
Docs Home
/ / /
Node.js ドライバー
/

フィルタリングされたサブセット

項目一覧

  • はじめに
  • 集計タスクの概要
  • 始める前に
  • Tutorial
  • エンジニアのマッチングステージを追加する
  • 最も小さいものから最も古い順に並べ替えるためのソートステージを追加します
  • 3 つの結果のみを表示するには制限ステージを追加します
  • 不要なフィールドを削除するために設定されていない ステージを追加します
  • 集計パイプラインの実行
  • 結果の解釈

このチュートリアルでは、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);
1

まず、 vocationフィールドの値が"ENGINEER"であるドキュメントを検索する $matchステージを追加します。

pipeline.push({
$match: {
"vocation": "ENGINEER"
},
});
2

次に、ドキュメントをdateofbirthフィールドで降順にソートする$sortステージを追加して、最も小さいユーザーを最初にリストします。

pipeline.push({
$sort: {
"dateofbirth": -1,
}
});
3

次に、パイプラインに$limitステージを追加して、結果の最初の 3 つのドキュメントのみを出力します。

pipeline.push({
$limit: 3
});
4

最後に、 $unsetステージを追加します。 $unsetステージは、結果ドキュメントから不要なフィールドを排除します。

pipeline.push({
$unset: [
"_id",
"address",
]
});

Tip

異なるフィールドを持つドキュメントがコレクションに追加される場合に集計パイプラインが変更されないようにするには、 $projectではなく$unset演算子を使用します。

5

次のコードをアプリケーションの末尾に追加して、 personsコレクションで集計を実行します。

const aggregationResult = await personColl.aggregate(pipeline);

最後に、shell で次のコマンドを実行してアプリケーションを起動します。

node agg_tutorial.js
6

集計された結果には 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 を参照してください。

戻る

集計チュートリアル