Docs Menu
Docs Home
/ / /
Node.js 드라이버
/ /

문서 찾기

찾기 작업을 수행하여 MongoDB 데이터베이스에서 데이터를 검색할 수 있습니다. find() 또는 findOne() 메서드를 호출하여 기준에 따라 문서를 일치시키는 찾기 작업을 수행할 수 있습니다.

인터랙티브 랩

이 페이지에는 find() 메서드를 사용하여 데이터를 조회하는 방법을 보여주는 짧은 인터랙티브 실습이 포함되어 있습니다. MongoDB 또는 코드 편집기를 설치하지 않고도 브라우저 창에서 직접 이 실습을 완료할 수 있습니다.

실습을 시작하려면 페이지 상단의 Open Interactive Tutorial 버튼을 클릭하세요. 실습을 전체 화면 형식으로 확장하려면 실습 창의 오른쪽 상단 모서리에 있는 전체 화면 버튼()을 클릭합니다.

다음 가이드에 표시된 대로 선택적 매개변수를 지정하거나 다른 메서드를 연결하여 찾기 작업이 반환하는 정보를 추가로 지정할 수도 있습니다:

  • 반환할 문서 지정

  • 반환할 필드 지정

집계 작업을 사용하여 데이터를 검색할 수도 있습니다. 이 유형의 작업을 사용하면 정렬된 변환 파이프라인을 일치하는 데이터에 적용할 수 있습니다.

데이터베이스에서 기준에 일치하는 수신 데이터를 모니터링하려는 경우 감시 작업을 사용하여 일치하는 데이터가 삽입될 때 실시간으로 알림을 받을 수 있습니다.

참고

쿼리 작업은 일치하는 문서가 포함된 커서 에 대한 참조를 반환할 수 있습니다. 커서에 저장된 데이터를 검사하는 방법을 학습하려면 커서에서 데이터 액세스 페이지를 참조하세요.

Node.js 드라이버를 사용하여 다음 환경에서 호스팅되는 배포에 대한 읽기 작업을 연결하고 수행할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: 구독 기반의 자체 관리형 MongoDB 버전입니다.

  • MongoDB Community: 소스 사용 가능하고, 무료로 사용할 수 있는 자체 관리형 MongoDB 버전

MongoDB Atlas에서 호스팅되는 배포서버를 위한 Atlas UI에서 읽기 작업을 수행하는 방법에 대한 자세한 내용은 문서 보기, 필터링 및 정렬을 참조하세요.

Collection 객체에서 find() 메서드를 호출할 수 있습니다. 이 메서드는 조회하려는 문서를 설명하는 쿼리 문서를 허용합니다. 쿼리 문서를 지정하는 방법에 대한 자세한 내용은 쿼리 지정하기 가이드를 참조하세요.

쿼리 기준 없음

쿼리 기준이 없는 찾기 작업을 실행하려면 빈 쿼리를 전달하거나 찾기 메서드 매개 변수에서 쿼리 문서를 생략할 수 있습니다.

다음 작업은 모두 myColl 컬렉션의 모든 문서를 반환합니다:

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

쿼리를 전달하지 않거나 빈 쿼리를 findOne() 메서드에 전달하면 작업은 컬렉션에서 단일 문서를 반환합니다.

빈 쿼리 전달하는 경우에도 커서 커서 를 찾기 작업에 연결할 수 있습니다. 예시 를 들어, 다음 코드는 빈 쿼리 매개변수를 수신하는 찾기 작업을 수행하는 동안 프로젝션 지정하는 방법을 보여줍니다.

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

문서 필드 프로젝션에 대한 자세한 내용은 반환할 필더 지정 가이드를 참조하세요.

find() 메소드는 일치하는 문서에 액세스할 수 있는 Cursor 인스턴스를 반환합니다. findOne() 메서드는 Promise 인스턴스를 반환하며, 이 인스턴스를 통해 일치하는 문서에 액세스하거나 일치하는 문서가 없는 경우에는 null 값에 액세스할 수 있습니다.

예시

한 피자 레스토랑에서 Lemony Snicket이 어제 주문한 모든 피자를 찾고자 합니다. 이를 위해 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 컬렉션 에서 단일 문서 찾습니다. 다음 매개변수를 사용합니다:

  • 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() 메서드를 사용할 수 있습니다. 이 메서드는 실행할 집계 표현식을 순서대로 허용합니다. 이러한 표현식을 사용하면 collection에서 결과 데이터를 필터링, 그룹화 및 정렬할 수 있습니다.

예시

피자 레스토랑에서 지난 주 피자 주문을 요약하는 즉시 상태 보고서를 실행하고자 합니다. orders 컬렉션에서 다음 aggregate() 쿼리를 실행하여 각 고유한 '상태' 필드에 대한 합계를 가져옵니다:

// 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() 실행 가능한 예시 는 Change Streams로 데이터 모니터링 가이드 의 예제 섹션을 참조하세요.

돌아가기

문서 쿼리

이 페이지의 내용