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

ドキュメントの検索

検索操作を実行して、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: ...},
...
]

注意

セットアップ例

この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、 MongoDBへの接続 ガイドを参照してください。この例では、Atlasサンプルデータセットに含まれる sample_mflixデータベースの moviesコレクションも使用します。Atlas を使い始める」ガイドに従って、 MongoDB Atlasの無料階層のデータベースにロードできます。

次の完全なファイルの例では、moviesコレクションから 1 つのドキュメントを検索します。次のパラメータを使用します。

  • title の値が 'The Room' であるドキュメントに一致するフィルタ。

  • 一致したドキュメントを評価の降順で整理する ソート。これにより、クエリが複数のドキュメントに一致した場合、返されるドキュメントは評価が最も高いドキュメントになります。

  • _id返されるドキュメントから フィールドを明示的に除外し、titleimdb オブジェクト(およびその埋め込みフィールド)のみを明示的に含む プロジェクション 。

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 } }

注意

セットアップ例

この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、 MongoDBへの接続 ガイドを参照してください。この例では、Atlasサンプルデータセットに含まれる sample_mflixデータベースの moviesコレクションも使用します。Atlas を使い始める」ガイドに従って、 MongoDB Atlasの無料階層のデータベースにロードできます。

次の完全なファイルの例では、 moviesコレクションからドキュメントを検索します。次のパラメータを使用します。

  • runtime値が15 分未満のドキュメントに一致するフィルタ。

  • 返されたドキュメントをタイトルの昇順で整理します(アルファベット順で「A」が「Z」の前に、「1」が「9」の前にあるアルファベット順)。

  • _id返されるドキュメントから フィールドを明示的に除外し、titleimdb オブジェクト(およびその埋め込みフィールド)のみを明示的に含む プロジェクション 。

1import { MongoClient } from "mongodb";
2
3// Replace the uri string with your MongoDB deployment's connection string.
4const uri = "<connection string uri>";
5
6const client = new MongoClient(uri);
7
8async 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}
37run().catch(console.dir);
1import { MongoClient } from "mongodb";
2
3// Replace the uri string with your MongoDB deployment's connection string.
4const uri = "<connection string uri>";
5
6const client = new MongoClient(uri);
7
8type Minutes = number;
9
10interface IMDB {
11 rating: number;
12 votes: number;
13 id: number;
14}
15
16interface Movie {
17 title: string;
18 imdb: IMDB;
19 runtime: Minutes;
20}
21
22async 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}
44run().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()メソッドの実行可能な例については、 「変更ストリームによるデータの監視」 ガイドの 例 のセクションを参照してください。

戻る

クエリ ドキュメント

項目一覧