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

Retrieve Data

項目一覧

  • Overview
  • ドキュメントの検索
  • ドキュメントからのデータの集計
  • データの変更を監視

検索操作を実行して、MongoDB データベースからデータを取得できます。検索操作を実行して、一連の条件でドキュメントを照合するには、find() メソッドまたは findOne() メソッドを呼び出します。

Tip

インタラクティブ ラボ

このページには、 find()メソッドを使用してデータを取得する方法を示す短いインタラクティブ ラボが含まれています。 MongoDB やコード エディターをインストールしなくても、ブラウザ ウィンドウでこのラボを直接完了できます。

ラボを開始するには、ページ上部の [ Open Interactive Tutorialボタンをクリックします。 ラボを全画面形式に展開するには、ラボ ペインの右上隅にある全画面ボタン( )をクリックします。

次のガイドに示すように、オプションのパラメータを指定するか、他のメソッドを連結することで、検索操作で返される情報をさらに指定することもできます。

  • 結果を並べ替える

  • 返された結果をスキップする

  • 返される結果の数を制限する

  • 返すフィールドを指定する

集計操作を使用してデータを取得することもできます。このタイプの操作では、一致したデータに対して特定の順序の変換パイプラインを適用できます。

一連の条件に一致する受信データがないかデータベースを監視する場合は、監視操作を使用して、一致するデータが挿入されたときにリアルタイムで通知を受けることができます。

注意

クエリ操作により、一致するドキュメントを含むカーソルへの参照が返される場合があります。カーソルに格納されているデータを調べる方法については、「カーソルの基礎ページ」を参照してください。

Node.js ドライバーを使用して、次の環境でホストされている配置に接続し、読み取り操作を実行できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる、MongoDB の自己管理型バージョン

MongoDB Atlas でホストされている配置の Atlas UI で読み取り操作を実行する方法の詳細については、「ドキュメントの表示、フィルタリング、ソート 」を参照してください。

Collectionオブジェクト上でfind()メソッドを呼び出すことができます。このメソッドは、取得したいドキュメントを記述したクエリドキュメントを受け入れます。クエリドキュメントを指定する方法の詳細については「クエリの指定」ガイドを参照してください。

Tip

クエリ条件なし

クエリ条件のない検索操作を実行するには、空のクエリを渡すか、検索メソッドのパラメータでドキュメントを省略します。

次の操作は両方とも、 myCollコレクション内のすべてのドキュメントを返します。

myColl.find(); // no query
myColl.find({}); // empty query

findOne() メソッドにクエリを渡さなかったり、空のクエリを渡したりしない場合、オペレーションはコレクションから 1 つのドキュメントを返します。

空のクエリを渡す場合でも、検索操作でオプションを指定できます。たとえば、次のコードは、空のクエリパラメータを受け取る検索操作を実行するときに、オプションとしてプロジェクションを指定する方法を示しています。

const options = {
projection: { _id: 0, field1: 1 },
};
const findResult = await myColl.findOne({}, options);

ドキュメントフィールドのプロジェクションについて詳しくは、「返すフィールドを指定する」ガイドを参照してください。

find() メソッドは Cursor インスタンスを返し、そこから一致したドキュメントにアクセスできます。findOne() メソッドは Promise インスタンスを返します。これを解決すると、一致するドキュメントにアクセスするか、一致しない場合は null 値に解決されます。

ピザレストランでは、レモニー・スニケットが昨日注文したピザをすべて見つけたいと思っています。担当者はordersコレクションに対し、以下のfind()クエリを実行します。

// Search for orders by name and within a specific date range
const findResult = orders.find({
name: "Lemony Snicket",
date: {
$gte: new Date(new Date().setHours(00, 00, 00)),
$lt: new Date(new Date().setHours(23, 59, 59)),
},
});

操作が戻ってくると、findResult 変数がCursorを参照します。以下に示すように、 for await...of構文を使用して取得したドキュメントを印刷できます。

for await (const doc of findResult) {
console.log(doc);
}

出力は、次のようになります。

[
{ name: "Lemony Snicket", type: "horseradish pizza", qty: 1, status: "delivered", date: ... },
{ name: "Lemony Snicket", type: "coal-fired oven pizza", qty: 3, status: "canceled", date: ...},
...
]

検索操作を示す実行可能なコード例については、以下の使用例参照してください。

findOne()メソッドとfind()メソッドの詳細については、次のサーバー マニュアル ドキュメントを参照してください。

カスタム処理パイプラインを実行してデータベースからデータを取得する場合は、aggregate() メソッドを使用できます。このメソッドは、順番に実行される集計式を受け入れます。これらの式を使用すると、コレクションからの結果データをフィルタリング、グループ化、および整理できます。

あるピザレストランが、過去 1 週間のピザ注文をまとめるステータスレポートをオンデマンドで実行したいと考えています。orders コレクションに対して次の aggregate() クエリを実行して、個別の "status" フィールドごとに合計値を取得します。

// Group orders by status within the last week
const aggregateResult = orders.aggregate([
{
$match: {
date: {
$gte: new Date(new Date().getTime() - 1000 * 3600 * 24 * 7),
$lt: new Date(),
},
},
},
{
$group: {
_id: "$status",
count: {
$sum: 1,
},
},
},
]);

操作が戻ってくると、aggregateResult 変数がCursorを参照します。以下に示すように、 for await...of構文を使用して取得したドキュメントを印刷できます。

for await (const doc of aggregateResult) {
console.log(doc);
}

出力は、次のようになります。

[
{ _id: 'delivering', count: 5 },
{ _id: 'delivered', count: 37 },
{ _id: 'created', count: 9 }
]

集計パイプラインの構築方法の詳細については、サーバー マニュアルの「集計ガイド」または「集計操作」を参照してください。

watch()メソッドを使用すると、特定の条件に一致するコレクションの変更を監視できます。変更には、挿入、アップデート、置換、および削除されたドキュメントが含まれます。このメソッドには、コレクションで書き込み操作が実行されるたびに、変更されたデータに対して順次実行される集計コマンドのパイプラインを渡すことができます。

ピザレストランは、新しいピザの注文が入るたびに通知を受け取りたいと考えています。これを実現するために、挿入操作でフィルタリングして特定のフィールドを返す集計パイプラインを作成します。 以下に示すように、このパイプラインをordersコレクションで呼び出されるwatch()メソッドに渡します。

// Set up a change stream to listen for new order insertions
const changeStream = orders.watch([
{ $match: { operationType: "insert" } },
{
$project: {
"fullDocument.name": 1,
"fullDocument.address": 1,
},
},
]);
changeStream.on("change", change => {
const { name, address } = change.fullDocument;
console.log(`New order for ${name} at ${address}.`);
});

watch()メソッドの実行可能な例については「変更の監視」の使用例を参照してください。

戻る

読み取り操作