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 projectFields = { _id: 0, field1: 1 }; const findResult = await myColl.findOne().project(projectFields);
ドキュメントフィールドのプロジェクションについて詳しくは、「返すフィールドを指定する」ガイドを参照してください。
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() 例: 完全なファイル
注意
セットアップ例
この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、 MongoDBへの接続 ガイドを参照してください。この例では、Atlasサンプルデータセットに含まれる sample_mflix
データベースの movies
コレクションも使用します。「Atlas を使い始める」ガイドに従って、 MongoDB Atlasの無料階層のデータベースにロードできます。
次の完全なファイルの例では、movies
コレクションから 1 つのドキュメントを検索します。次のパラメータを使用します。
title
の値が'The Room'
であるドキュメントに一致するフィルタ。一致したドキュメントを評価の降順で整理する ソート。これにより、クエリが複数のドキュメントに一致した場合、返されるドキュメントは評価が最も高いドキュメントになります。
_id
返されるドキュメントから フィールドを明示的に除外し、title
とimdb
オブジェクト(およびその埋め込みフィールド)のみを明示的に含む プロジェクション 。
import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string. const uri = "<connection string uri>"; const client = new MongoClient(uri); async function run() { try { // Get the database and collection on which to run the operation const database = client.db("sample_mflix"); const movies = database.collection("movies"); // Query for a movie that has the title 'The Room' const query = { title: "The Room" }; const options = { // Sort matched documents in descending order by rating sort: { "imdb.rating": -1 }, // Include only the `title` and `imdb` fields in the returned document projection: { _id: 0, title: 1, imdb: 1 }, }; // Execute query const movie = await movies.findOne(query, options); // Print the document returned by findOne() console.log(movie); } finally { await client.close(); } } run().catch(console.dir);
import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string. const uri = "<connection string uri>"; const client = new MongoClient(uri); interface IMDB { rating: number; votes: number; id: number; } export interface Movie { title: string; year: number; released: Date; plot: string; type: "movie" | "series"; imdb: IMDB; } type MovieSummary = Pick<Movie, "title" | "imdb">; async function run(): Promise<void> { try { const database = client.db("sample_mflix"); // Specifying a Schema is always optional, but it enables type hinting on // finds and inserts const movies = database.collection<Movie>("movies"); const movie = await movies.findOne<MovieSummary>( { title: "The Room" }, { sort: { rating: -1 }, projection: { _id: 0, title: 1, imdb: 1 }, } ); console.log(movie); } finally { await client.close(); } } run().catch(console.dir);
上記の例を実行すると、次の出力が生成されます。
{ title: 'The Room', imdb: { rating: 3.5, votes: 25673, id: 368226 } }
find() 例: 完全なファイル
注意
セットアップ例
この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、 MongoDBへの接続 ガイドを参照してください。この例では、Atlasサンプルデータセットに含まれる sample_mflix
データベースの movies
コレクションも使用します。「Atlas を使い始める」ガイドに従って、 MongoDB Atlasの無料階層のデータベースにロードできます。
次の完全なファイルの例では、 movies
コレクションからドキュメントを検索します。次のパラメータを使用します。
runtime
値が15 分未満のドキュメントに一致するフィルタ。返されたドキュメントをタイトルの昇順で整理します(アルファベット順で「A」が「Z」の前に、「1」が「9」の前にあるアルファベット順)。
_id
返されるドキュメントから フィールドを明示的に除外し、title
とimdb
オブジェクト(およびその埋め込みフィールド)のみを明示的に含む プロジェクション 。
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 11 // Get the database and collection on which to run the operation 12 const database = client.db("sample_mflix"); 13 const movies = database.collection("movies"); 14 15 // Query for movies that have a runtime less than 15 minutes 16 const query = { runtime: { $lt: 15 } }; 17 const sortFields = { title: 1 }; 18 const projectFields = { _id: 0, title: 1, imdb: 1 }; 19 20 // Execute query 21 const cursor = movies.find(query).sort(sortFields).project(projectFields); 22 23 // Print a message if no documents were found 24 if ((await movies.countDocuments(query)) === 0) { 25 console.log("No documents found!"); 26 } 27 28 // Print returned documents 29 for await (const doc of cursor) { 30 console.dir(doc); 31 } 32 33 } finally { 34 await client.close(); 35 } 36 } 37 run().catch(console.dir);
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 type Minutes = number; 9 10 interface IMDB { 11 rating: number; 12 votes: number; 13 id: number; 14 } 15 16 interface Movie { 17 title: string; 18 imdb: IMDB; 19 runtime: Minutes; 20 } 21 22 async function run() { 23 try { 24 const database = client.db("sample_mflix"); 25 const movies = database.collection<Movie>("movies"); 26 27 const query = { runtime: { $lt: 15 } }; 28 const sortFields = { title: 1 }; 29 const projectFields = { _id: 0, title: 1, imdb: 1 }; 30 31 const cursor = movies.find<Movie>(query).sort(sortFields).project(projectFields); 32 33 if ((await movies.countDocuments(query)) === 0) { 34 console.warn("No documents found!"); 35 } 36 37 for await (const doc of cursor) { 38 console.dir(doc); 39 } 40 } finally { 41 await client.close(); 42 } 43 } 44 run().catch(console.dir);
上記の例を実行すると、次の出力が生成されます。
{ title: '10 Minutes', imdb: { rating: 7.9, votes: 743, id: 339976 } } { title: '3x3', imdb: { rating: 6.9, votes: 206, id: 1654725 } } { title: '7:35 in the Morning', imdb: { rating: 7.3, votes: 1555, id: 406501 } } { title: '8', imdb: { rating: 7.8, votes: 883, id: 1592502 } } ...
注意
カーソルを反復処理する前に、sort()
、limit()
、skip()
、project()
などのカーソル メソッドを読み取り操作に連結する必要があります。カーソルを反復処理した後にカーソル メソッドを指定した場合、 設定は読み取り操作には適用されません。
詳細情報
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()
メソッドの実行可能な例については、 「変更ストリームによるデータの監視」 ガイドの 例 のセクションを参照してください。