본문 바로가기
데이터베이스/MongoDB

[MongoDB] 내장/중첩 문서에 대한 검색(쿼리)

by minhyeok.lee 2023. 3. 9.
반응형

[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" ] }
]

 

반응형

댓글