[MongoDB] 객체 안에 객체가 있는 문서 즉, 내장/중첩 문서에 대한 쿼리(검색)
* MongoDB Shell에서 진행
아래와 같은 문서 내용을 삽입해준다.
db.user.insertMany([
{ _id: 1, info: { role: "Magician", level: 15 }, name: "user1", skills: [ "A", "B", "C" ] },
{ _id: 2, info: { role: "Warrior", level: 20 }, name: "user11", skills: [ "B" ] },
{ _id: 3, info: { role: "Magician", level: 25 }, name: "user111", skills: [ "A", "B" ] },
{ _id: 4, info: { role: "Thief", level: 30 }, name: "user1111", skills: [ "B", "A" ] },
{ _id: 5, info: { role: "Warrior", level: 20 }, name: "user1112", skills: [ [ "A", "B" ], "C" ] }
]);
포함/내포된 문서 일치
포함/중첩 문서인 필드에 동등 조건을 지정하려면 쿼리 필터 문서 { <필드>: <값> }을 사용한다.
여기서 <값>은 일치시킬 문서이다.
예를 들어 다음 쿼리는 필드가 { role: "Magician", level: 15 } 문서와 같은 모든 문서를 선택한다.
db.user.find({ info: { role: "Warrior", level: 20 }})
출력값
[
{ _id: 2, info: { role: "Warrior", level: 20 }, name: "user11", skills: [ "B" ] },
{ _id: 5, info: { role: "Warrior", level: 20 }, name: "user1112", skills: [ [ "A", "B" ], "C" ] }
]
포함된 전체 문서에 대한 동등 일치는 필드 순서를 포함하여 지정된 <value> 문서와 정확히 일치해야 한다.
예를 들어 다음 쿼리는 인벤토리 컬렉션의 어떤 문서와도 일치하지 않는다.
db.user.find({ info: { level: 20, role: "Warrior" }})
출력값
[]
중첩 필드에 대한 쿼리
포함/중첩 문서의 필드에 쿼리 조건을 지정하려면 점 표기법("field.nestedField")을 사용한다.
점 표기법을 사용하여 쿼리할 때 필드와 중첩 필드는 따옴표 안에 있어야 한다.
1. 중첩된 필드에 동등 일치 지정
다음 예에서는 info 필드에 중첩된 role 필드가 "Magician"인 모든 문서를 선택한다
db.user.find({ "info.role": "Magician" })
출력값
[
{ _id: 1, info: { role: "Magician", level: 15 }, name: "user1", skills: [ "A", "B", "C" ] },
{ _id: 3, info: { role: "Magician", level: 25 }, name: "user111", skills: [ "A", "B" ] }
]
2. 쿼리 연산자를 사용하여 일치 지정
쿼리 필터 문서는 쿼리 연산자를 사용하여 다음 형식으로 조건을 지정할 수 있다.
{ <field1>: { <operator1>: <value1> }, ... }
다음 쿼리는 info 필드에 포함된 level 필드에서 보다 작음 연산자($lt)를 사용한다.
db.user.find({ "info.level": { $lt: 20 } })
출력값
[
{ _id: 1, info: { role: "Magician", level: 15 }, name: "user1", skills: [ "A", "B", "C" ] }
]
3. AND 조건 지정
다음 쿼리는 중첩 필드 leveld이 15초과이고 중첩 필드 role이 "Warrior"이고 skills 배열에 "A"가 있는 모든 문서를 선택한다.
db.user.find({ "info.role": "Warrior", "info.level": { $gt: 15 }, skills: "B" })
출력값
[
{ _id: 2, info: { role: "Warrior", level: 20 }, name: "user11", skills: [ "B" ] }
]
'데이터베이스 > MongoDB' 카테고리의 다른 글
[MongoDB] $elemMatch (query) (0) | 2023.03.10 |
---|---|
[MongoDB] 배열의 여러가지 Query 종류 (0) | 2023.03.10 |
[MongoDB] 값 일치, 값 포함 여부로 검색 ($eq, $regex) (0) | 2023.03.09 |
[MongoDB] 쿼리 및 프로젝션 연산자 - 4. 배열, 비트, 투영, 기타 연산자 (0) | 2023.03.08 |
[MongoDB] 쿼리 및 프로젝션 연산자 - 3. 지리-공간 쿼리 연산자 (0) | 2023.03.08 |
댓글