Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

문서 찾기

찾기 작업을 수행하여 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 컬렉션도 사용합니다. MongoDB 시작하기단계에 따라 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 컬렉션도 사용합니다. MongoDB 시작하기단계에 따라 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로 데이터 모니터링 가이드 의 예제 섹션을 참조하세요.