Docs Menu

쿼리 결과 수정

이 가이드 에서는 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가 이러한 연결을 로드하도록 하려면 속성 목록에 외래 키가 있는 필드를 포함해야 합니다.

다음 예시 에서 BandManager 모델에는 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 또는 idwithout 메서드에 전달하면 Mongoid는 이를 무시합니다.

orderorder_by 메서드를 사용하여 Mongoid가 문서를 반환하는 순서를 지정할 수 있습니다.

이 메서드는 문서의 정렬 기준으로 사용할 필드와 각 필드 에 오름차순 또는 내림차순을 사용할지 여부를 나타내는 해시를 허용합니다.

정수, 기호 또는 문자열을 사용하여 정렬 방향을 지정할 수 있습니다. 일관성 위해 애플리케이션 전체에서 동일한 정렬 구문을 사용하는 것이 좋습니다. 다음 목록은 각 구문을 제공하고 nameyear 필드를 정렬하는 방법을 보여줍니다.

  • 정수 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]])

  • 기호에 대한 ascdesc 메서드

    • 예시: Band.order(:name.asc, :year.desc)

  • SQL 구문

    • 예시: Band.order('name asc', 'year desc')

order 또는 order_by을 사용하는 대신 ascdesc 메서드를 사용하여 정렬 순서를 지정할 수도 있습니다.

Band.asc('name').desc('year')

정렬 사양을 연결할 때 첫 번째 호출은 첫 번째 정렬 순서를 정의하고 가장 최근 호출은 이전 정렬이 적용된 후 마지막 정렬 순서를 정의합니다.

참고

범위 내 정렬

모델에 정렬 사양이 포함된 기본값 범위를 정의하면 기본값 범위가 먼저 평가되므로 범위 정렬이 쿼리 에 지정된 정렬보다 우선합니다.

Mongoid는 Criteria 객체에 사용할 수 있는 limit, skipbatch_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 데이터 모델링에 대해 학습 데이터 모델링 가이드를 참조하세요.