쿼리 결과 수정
개요
이 가이드 에서는 Mongoid가 쿼리에서 결과를 반환하는 방식을 사용자 지정하는 방법을 학습 수 있습니다. MongoDB 사용하면 다음 작업을 수행하여 결과가 표시되는 방식을 수정할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 밴드 또는 음악 그룹 나타내는 Band
모델을 사용합니다. Band
모델의 정의는 다양한 쿼리 기능을 보여주기 위해 섹션마다 다를 수 있습니다. 일부 섹션에서는 특정 밴드를 관리하는 사람을 나타내는 Manager
모델이나 특정 밴드의 라이브 공연을 나타내는 Tour
모델도 사용합니다.
지정된 필드 반환
MongoDB 에서 프로젝션 결과에 포함하거나 제외할 필드를 지정하는 프로세스 입니다. Mongoid는 프로젝트 필드에 다음과 같은 연산자를 제공합니다.
only
: 포함할 필드를 지정합니다.without
: 제외할 필드를 지정합니다.
필드 포함
only
메서드는 데이터베이스에서 지정된 필드만 검색합니다.
다음 코드는 members
필드 값이 4
인 문서에서 name
필드 만 반환합니다.
Band.where(members: 4).only(:name)
참고
_id 필드
MongoDB 에서 _id
필드 명시적으로 포함하지 않더라도 결과에 포함됩니다.
로드되지 않은 속성을 참조하려고 하면 Mongoid에서 Mongoid::Errors::AttributeNotLoaded
오류가 발생합니다.
only
메서드를 사용하여 내장된 문서의 필드를 포함할 수도 있습니다.
Band
모델에 여러 Tour
객체가 포함되어 있다고 가정해 보겠습니다. 다음 코드에 표시된 대로 year
와 같은 Tour
모델의 필드를 프로젝트 할 수 있습니다.
bands = Band.only(:name, 'tours.year')
그런 다음 반환된 문서에서 포함된 필드에 액세스 할 수 있습니다.
# Returns the first Tour object from # the first Band in the results bands.first.tours.first
참조된 연관 관계의 필드를 only
메서드에 전달할 수 있지만 포함된 객체를 로드할 때 프로젝션 무시됩니다. Mongoid는 참조된 연관 관계의 모든 필드를 로드합니다. 예시 들어, 앞의 코드와 같이 포함된 Tour
객체 에 액세스 Mongoid는 year
필드 뿐만 아니라 완전한 객체 반환합니다.
참고
MongoDB 4.4 이상을 실행 배포서버 에 연결된 경우 동일한 쿼리 의 프로젝션 에서 연결 및 해당 필드를 지정할 수 없습니다.
문서 에 has_one
또는 has_and_belongs_to_many
연결이 포함되어 있고 only
메서드를 호출할 때 Mongoid가 이러한 연결을 로드하도록 하려면 속성 목록에 외래 키가 있는 필드를 포함해야 합니다.
다음 예시 에서 Band
및 Manager
모델에는 has_and_belongs_to_many
연관 관계가 있습니다.
class Band include Mongoid::Document field :name, type: String has_and_belongs_to_many :managers end class Manager include Mongoid::Document has_and_belongs_to_many :bands end
다음 코드는 manager_ids
필드 포함하는 경우 Mongoid가 관련 Manager
객체를 로드하는 방법을 보여줍니다.
# Returns null Band.where(name: 'Astral Projection').only(:name).first.managers # Returns the first Manager object Band.where(name: 'Astral Projection').only(:name, :manager_ids).first.managers
필드 제외하기
without
메서드를 사용하여 결과에서 필드를 명시적으로 제외할 수 있습니다.
다음 코드는 반환된 Band
객체에서 year
필드 제외합니다.
Band.where(members: 4).without(:year)
중요
_id 필드
Mongoid는 다양한 작업에 필드 _id
필요하므로 _id
id
결과에서 필드 또는 별칭을 제외할 수 없습니다. _id
또는 id
를 without
메서드에 전달하면 Mongoid는 이를 무시합니다.
결과 정렬
order
및 order_by
메서드를 사용하여 Mongoid가 문서를 반환하는 순서를 지정할 수 있습니다.
이 메서드는 문서의 정렬 기준으로 사용할 필드와 각 필드 에 오름차순 또는 내림차순을 사용할지 여부를 나타내는 해시를 허용합니다.
정수, 기호 또는 문자열을 사용하여 정렬 방향을 지정할 수 있습니다. 일관성 위해 애플리케이션 전체에서 동일한 정렬 구문을 사용하는 것이 좋습니다. 다음 목록은 각 구문을 제공하고 name
및 year
필드를 정렬하는 방법을 보여줍니다.
정수
1
(오름차순) 및-1
(내림차순)예시:
Band.order(name: 1, year: -1)
기호
:asc
및:desc
예시:
Band.order(name: :asc, year: :desc)
문자열
"asc"
및"desc"
예시:
Band.order_by(name: "asc", year: "desc")
order
메서드는 다음 정렬 사양도 허용합니다.
요소를 2개 가진 배열의 배열:
문자열
예시:
Band.order([['name', 'asc'], ['year', 'desc']])
기호
예시:
Band.order([[:name, :asc], [:year, :desc]])
기호에 대한
asc
및desc
메서드예시:
Band.order(:name.asc, :year.desc)
SQL 구문
예시:
Band.order('name asc', 'year desc')
팁
order
또는 order_by
을 사용하는 대신 asc
및 desc
메서드를 사용하여 정렬 순서를 지정할 수도 있습니다.
Band.asc('name').desc('year')
정렬 사양을 연결할 때 첫 번째 호출은 첫 번째 정렬 순서를 정의하고 가장 최근 호출은 이전 정렬이 적용된 후 마지막 정렬 순서를 정의합니다.
페이지 매김 결과
Mongoid는 Criteria
객체에 사용할 수 있는 limit
, skip
및 batch_size
페이지 매김 메서드를 제공합니다. 다음 섹션에서는 이러한 연산자를 사용하는 방법에 대해 설명합니다.
결과 수 제한
limit
메서드를 사용하여 Mongoid가 반환하는 결과 수를 제한할 수 있습니다.
다음 코드는 최대 5
개의 문서를 조회합니다.
Band.limit(5)
참고
또는 take
메서드를 사용하여 데이터베이스 에서 지정된 수의 문서를 조회 수 있습니다.
Band.take(5)
결과 건너뛰기
skip
메서드 또는 해당 메서드의 별칭 offset
을 사용하여 지정된 수의 결과를 건너뛸 수 있습니다.
limit
호출을 skip
에 연결하면 다음 예시 와 같이 문서를 건너뛴 후에 제한이 적용됩니다.
Band.skip(2).limit(5) # Skips the first two results and returns # the following five results
팁
페이지 매김을 수행할 때 skip
일관적인 결과를 얻으려면 정렬된 결과에 를 사용하세요.
다음 코드는 결과를 반환할 때 처음 3
개 문서를 건너뜁니다.
Band.skip(3) # Equivalent Band.offset(3)
결과 배치 생성
대규모 쿼리를 실행하고 와 같은 열거자 메서드를 사용하여 쿼리 결과를 반복할 Criteria#each
때 Mongoid는 자동으로 MongoDB getMore 명령을 사용하여 결과를 배치로 로드합니다. 기본값 배치 크기는 1000
이지만 batch_size
메서드를 사용하여 다른 값을 설정하다 수 있습니다.
다음 코드는 배치 크기를 500
로 설정합니다.
Band.batch_size(500)
추가 정보
To learn more about constructing queries, see the 문서 쿼리 지정 guide.
Mongoid 데이터 모델링에 대해 학습 데이터 모델링 가이드를 참조하세요.