개요
찾기 작업을 수행하여 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: ...}, ... ]
findOne() 예제: 전체 파일
참고
설정 예시
이 예시 연결 URI를 사용하여 MongoDB 인스턴스 에 연결합니다. MongoDB 인스턴스에 연결하는 방법에 대해 자세히 학습하려면 MongoDB 에 연결 가이드를 참조하세요. 이 예시 Atlas 샘플 데이터 세트에 포함된 sample_mflix
데이터베이스의 movies
컬렉션도 사용합니다. Atlas 시작하기 가이드에 따라 MongoDB Atlas 의 무료 계층 에서 데이터베이스 에 로드할 수 있습니다.
다음 전체 파일 예시 movies
컬렉션 에서 단일 문서 찾습니다. 다음 매개변수를 사용합니다:
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()
메서드를 사용할 수 있습니다. 이 메서드는 실행할 집계 표현식을 순서대로 허용합니다. 이러한 표현식을 사용하면 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로 데이터 모니터링 가이드 의 예제 섹션을 참조하세요.