문서 조회 (Query Documents)
문서 조회 (Query Documents)
MongoDB에서 읽기(Read) 작업은 곧 데이터베이스에 쿼리를 보내는 일이에요. 이 페이지에서는 문서를 조회하는 방법을 예제 위주로 살펴볼게요.
MongoDB에서는 아래 방법으로 문서를 조회할 수 있어요.
- 프로그래밍 언어의 드라이버(driver)를 이용하는 방법
이 페이지의 예제는 inventory 컬렉션을 사용해요. 먼저 MongoDB 인스턴스의 테스트 데이터베이스에 연결하고 inventory 컬렉션을 만들고, 다음 문서들을 넣어두면 돼요.
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
] );
컬렉션의 모든 문서 조회하기
컬렉션의 모든 문서를 조회하려면 find 메서드의 쿼리 필터 매개변수로 빈 문서인 {}를 넘겨주면 돼요. 쿼리 필터 매개변수가 바로 선택 기준을 결정해요.
db.inventory.find( {} )
빈 쿼리 필터 {}는 다음 SQL 문에 해당해요.
SELECT * FROM inventory
일치 조건(Equality Condition) 지정하기
일치 조건을 지정할 때는 쿼리 필터 문서에서 <field>:<value> 형태의 표현식을 사용해요.
{ <field1>: <value1>, ... }
예를 들어 inventory 컬렉션에서 status가 "D"인 문서만 조회할까요.
db.inventory.find( { status: "D" } )
이 쿼리는 status가 "D"인 두 문서(paper, planner)를 돌려줘요.
이 작업은 { status: "D" }라는 쿼리 필터를 사용하며, 다음 SQL 문에 해당해요.
SELECT * FROM inventory WHERE status = "D"
쿼리 연산자(Query Operator)로 조건 지정하기
일치 조건 외에도 MongoDB는 쿼리 연산자를 다양하게 제공해요. 같은 필드에 여러 후보 값을 넣고 싶을 때 $in 연산자를 쓰면 돼요.
다음 예제는 inventory 컬렉션에서 status가 "A" 또는 "D" 중 하나인 문서를 모두 조회해요.
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
이 작업은 { status: { $in: [ "A", "D" ] } }라는 쿼리 필터를 사용하며, 다음 SQL 문에 해당해요.
SELECT * FROM inventory WHERE status in ("A", "D")
MongoDB 쿼리 연산자의 전체 목록은 Query Predicates 문서를 참고하세요.
AND 조건 지정하기
복합 쿼리(compound query)는 컬렉션 문서의 필드 두 개 이상에 조건을 걸 수 있어요. 기본적으로 복합 쿼리의 각 절은 논리적 AND로 연결돼서, 모든 조건을 동시에 만족하는 문서만 선택해요.
다음 예제는 inventory 컬렉션에서 status가 "A" 이고 qty가 30보다 작은($lt) 문서를 조회해요.
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
이 작업은 { status: "A", qty: { $lt: 30 } }라는 쿼리 필터를 사용하며, 다음 SQL 문에 해당해요.
SELECT * FROM inventory WHERE status = "A" AND qty < 30
다른 MongoDB 비교 연산자 목록은 비교 연산자(comparison operators) 문서를 참고하세요.
OR 조건 지정하기
$or 연산자를 사용하면 각 절을 논리적 OR로 연결하는 복합 쿼리를 만들 수 있어요. 이 쿼리는 조건 중 하나라도 만족하는 문서를 선택해요.
다음 예제는 inventory 컬렉션에서 status가 "A" 또는 qty가 30보다 작은($lt) 문서를 조회해요.
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
이 작업은 { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] }라는 쿼리 필터를 사용하며, 다음 SQL 문에 해당해요.
SELECT * FROM inventory WHERE status = "A" OR qty < 30
AND와 OR 조건 함께 지정하기
AND 조건과 OR 조건을 한 쿼리에 섞을 수도 있어요. 같은 필드($or)끼리 먼저 묶고, 그 결과를 다시 AND로 연결하는 식이에요.
다음 예제는 inventory 컬렉션에서 status가 "A" 이고 (qty가 30보다 작거나 또는 item이 문자 p로 시작하는) 문서를 조회해요.
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: { $regex: "^p" } } ]
} )
이 작업은 다음 쿼리 필터를 사용하며, 해당하는 SQL 문은 다음과 같아요.
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
여기서 item이 문자로 시작하는 조건은 정규 표현식 연산자 $regex로 처리했어요. MongoDB는 문자열 패턴 매칭을 위해 $regex 정규 표현식 쿼리를 지원해요.