쿼리 빌더
이 페이지의 내용
- 개요
- 시작하기 전에
- 일치하는 문서 조회
- Where 메서드 예제
- 논리적 조건부 연산
- 범위 및 유형 검사
- 텍스트 패턴 일치 예시
- Retrieve Distinct Values
- 집계
- 공통 필드 값별로 그룹화된 결과 예시
- 결과 수 예시
- 필드 예시의 최대값
- 필드의 최소값 예제
- 필드 예시의 평균값
- 필드의 합계 값 예시
- 일치하는 결과 집계 예시
- 쿼리 결과 수정
- 주문 결과 예시
- 지정된 수의 결과 생략 예시
- 결과 예제에 필드 및 배열 값의 하위 집합 표시
- 결과 페이지 매김 예시
- MongoDB 작업을 사용하여 데이터 검색
- 필드 예시 포함
- 모든 필드 포함 예시
- 배열 크기 일치 예시
- 데이터 유형 일치 예시
- 모듈로 예제로 계산된 값 일치
- 정규식 일치
- MongoDB 쿼리 API 작업 실행 예시
- 배열 요소 일치 예시
- 커서 시간 초과 지정 예시
- 지리 공간적 작업을 사용하여 위치 일치
- 근거리 위치 예시
- 영역 내 예시
- 지오메트리 교차 예시
- 주변 일치 항목에 대한 근접 데이터 예시
- MongoDB 쓰기 작업을 사용하여 데이터 쓰기
- 문서 예시 업로드
- 숫자 값 증가 예제
- 숫자 값 감소 예시
- 배열 요소 추가 예제
- 배열 요소 제거 예제
- 필드 제거 예시
개요
이 가이드 에서는 Laravel 쿼리 빌더의 Laravel 통합 확장을 사용하여 MongoDB database 로 작업하는 방법을 학습 수 있습니다. 쿼리 빌더를 사용하면 단일 구문과 유창한 인터페이스를 사용하여 지원되는 모든 데이터베이스 에 대한 쿼리를 쓰기 (write) 수 있습니다.
참고
Laravel 통합은 유사한 데이터베이스 작업을 실행 수 있는 Laravel의 쿼리 빌더와 Eloquent ORM을 확장합니다. Eloquent 모델을 사용하여 문서를 검색하는 방법에 학습 보려면 읽기 작업을 참조하세요.
Laravel은 데이터베이스 작업을 수행할 수 있는 쿼리 빌더 클래스 DB
에 액세스할 수 있는 파사드 를 제공합니다. 클래스에 대한 정적 인터페이스인 Facade는 구문을 더 간결하게 만들고 런타임 오류를 방지하며 테스트 가능성을 향상시킵니다.
Laravel 통합은 컬렉션 에 액세스 있는 DB
메서드 table()
를 제공합니다. 명령 및 제약 조건을 지정하는 체인 메서드. 그런 다음 끝에 get()
메서드를 연결하여 메서드를 실행 하고 결과를 조회 합니다. 다음 예시 는 쿼리 빌더 호출의 구문을 보여줍니다.
DB::table('<collection name>') // chain methods by using the "->" object operator ->get();
팁
DB::table()
메서드를 사용하기 전에 MongoDB를 애플리케이션의 기본 데이터베이스 연결로 지정해야 합니다. 데이터베이스 연결 설정에 대한 지침은 빠른 시작 의 MongoDB 연결 구성 단계를 참조하세요.
MongoDB가 애플리케이션의 기본 데이터베이스가 아닌 경우 DB::connection()
메서드를 사용하여 MongoDB 연결을 지정할 수 있습니다. 다음 코드에 표시된 대로 연결 이름을 connection()
메서드에 전달합니다.
$connection = DB::connection('mongodb');
이 가이드에서는 다음과 같은 유형의 쿼리 빌더 작업에 대한 예를 제공합니다.
시작하기 전에
이 가이드의 코드 예제를 실행하려면 빠른 시작 튜토리얼을 완료하여 웹 애플리케이션을 구성하고, 샘플 데이터 세트를 MongoDB deployment에 로드하고, 컨트롤러 메서드에서 예제 코드를 실행합니다. 예상 코드 출력을 JSON 문서로 보려면 빠른 시작의 선택 사항인 결과를 JSON 문서로 보기 단계에 표시된 toJson()
메서드를 사용합니다.
쿼리 빌더를 사용하여 읽기 및 쓰기 작업을 수행하려면 Illuminate\Support\Facades\DB
파사드를 가져오고 쿼리를 작성합니다.
일치하는 문서 조회
이 섹션에는 다음 연산자 카테고리의 읽기 작업에 대한 쿼리 빌더 예제가 포함되어 있습니다.
Where 메서드 예제
다음 예시에서는 where()
쿼리 빌더 메서드를 사용하여 movies
컬렉션에서 정확히 9.3
의 imdb.rating
필드 값을 포함하는 문서를 검색하는 방법을 보여 줍니다. 쿼리에서 반환된 결과를 보려면 VIEW OUTPUT 버튼을 클릭합니다.
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', 9.3) ->get();
[ { "title": "Cosmos", "year": 1980, "runtime": 60, "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, "plot": "Astronomer Carl Sagan leads us on an engaging guided tour of the various elements and cosmological theories of the universe.", ... }, { "title": "The Shawshank Redemption", "year": 1994, "runtime": 142, "imdb": { "rating": 9.3, "votes": 1521105, "id": 111161 }, "plot": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.", ... }, { "title": "The Real Miyagi", "year": 2015, "runtime": 90, "imdb": { "rating": 9.3, "votes": 41, "id": 2313306 }, "plot": "The life of the greatest karate master of a generation.", ... } ]
논리적 조건부 연산
이 섹션의 예제에서는 다음과 같은 논리적 조건부 작업을 수행하는 데 사용할 수 있는 쿼리 빌더 구문을 보여줍니다.
논리 OR 예제
다음 예제에서는 orWhere()
쿼리 빌더 메서드를 체인으로 연결하여 movies
컬렉션에서 1955
의 year
값과 일치하거나 title
값 "Back to the Future"
과 일치하는 문서를 검색하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->where('year', 1955) ->orWhere('title', 'Back to the Future') ->get();
논리 AND 예제
다음 예에서는 where()
쿼리 빌더 메서드를 체인으로 연결하여 movies
컬렉션에서 8.5
보다 큰 imdb.rating
값과 1940
보다 작은 year
값 모두와 일치하는 문서를 검색하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where('year', '<', 1940) ->get();
논리적 NOT 예제
다음 예에서는 whereNot()
쿼리 빌더 메서드를 호출하여 movies
컬렉션에서 2
보다 큰 imdb.rating
값이 없는 문서와 일치하는 문서를 검색하는 방법을 보여 줍니다. 이는 imdb.rating
가 2
이하인 모든 문서를 일치시키는 것과 같습니다.
$result = DB::connection('mongodb') ->table('movies') ->whereNot('imdb.rating', '>', 2) ->get();
중첩된 논리 연산자 그룹 예제
다음 예제에서는 where()
쿼리 빌더 메서드를 연결하여 movies
컬렉션에서 다음 두 조건과 모두 일치하는 문서를 검색하는 방법을 보여 줍니다. 이 예에서는 where()
쿼리 빌더 메서드의 첫 번째 매개 변수로 클로저를 전달하여 논리적 OR 그룹을 그룹화합니다.
imdb.rating
값이 다음보다 큼8.5
year
값이1986
또는1996
경우
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where(function (Builder $query) { return $query ->where('year', 1986) ->orWhere('year', 1996); })->get();
범위 및 유형 검사
이 섹션의 예제에서는 다음 범위 쿼리 및 유형 검사 작업을 사용하여 값을 일치시키는 데 사용할 수 있는 쿼리 빌더 구문을 보여줍니다.
숫자 범위 예제
다음 예제에서는 whereBetween()
쿼리 빌더 메서드를 사용하여 9
에서 9.5
사이의 imdb.rating
값을 포함하는 movies
컬렉션에서 문서를 조회하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->whereBetween('imdb.rating', [9, 9.5]) ->get();
[ { "title" "The Godfather", "imdb": { "rating": 9.2, "votes": 1038358, "id": 68646 }, ... }, { "title": "Hollywood", "imdb": { "rating": 9.1, "votes": 511,"id": 80230 }, ... }, { "title": "Cosmos", "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, ... }, ... ]
Null 또는 누락된 값 예시
다음 예에서는 whereNull()
쿼리 빌더 메서드를 사용하여 runtime
값 또는 필드가 생략된 movies
컬렉션에서 문서를 검색하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->whereNull('runtime') ->get();
하나 이상의 값 집합 예제
다음 예제에서는 whereIn()
쿼리 빌더 메서드를 사용하여 지정된 집합의 title
값 중 하나 이상과 일치하는 movies
컬렉션에서 문서를 검색하는 방법을 보여 줍니다.
$result = DB::table('movies') ->whereIn('title', ['Toy Story', 'Shrek 2', 'Johnny English']) ->get();
[ { "title": "Toy Story", "year": 1995, "runtime": 81, ... }, { "title": "Johnny English", "year": 2003, "runtime": 87, ... }, { "title": "Shrek 2", "year" 2004, "runtime": 93, ... }, ... ]
일치 날짜 예시
다음 예제에서는 whereDate()
쿼리 빌더 메서드를 사용하여 released
필드에 지정된 2010-1-15
날짜와 일치하는 movies
컬렉션의 문서를 검색하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->whereDate('released', '2010-1-15') ->get();
텍스트 패턴 일치 예시
다음 예제에서는 like
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 사용하여 지정된 텍스트 패턴을 사용하여 movies
컬렉션에서 문서를 검색하는 방법을 보여 줍니다.
텍스트 패턴에는 다음 와일드카드 문자가 혼합된 텍스트가 포함될 수 있습니다.
%
0개 이상의 문자와 일치_
단일 문자와 일치하는
$result = DB::table('movies') ->where('title', 'like', '%spider_man%') ->get();
[ { "title": "Kiss of the Spider Woman", ... }, { "title": "Spider-Man", ... }, { "title": "Spider-Man 2", ...}, ... ]
whereLike() 및 whereNotLike() 메서드
다음 메서드는 like 쿼리 연산자 를 사용하여 패턴을 일치시키는 것과 동일한 기능을 제공합니다.
whereLike()
: 지정된 패턴 과 일치합니다. 기본값 으로 이 메서드는 대소문자를 구분하지 않고 일치를 수행합니다. 메서드의 마지막 매개변수로true
을(를) 전달하여 대소문자 구분을 활성화 할 수 있습니다.whereNotLike()
: 필드 값에 지정된 string 패턴 이 포함되지 않은 문서를 일치시킵니다.
다음 예시 에서는 whereLike()
메서드를 사용하여 title
필드 에 대소문자 구분이 활성화된 'Start%'
패턴 과 일치하는 값이 있는 문서를 일치시키는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->whereLike('title', 'Start%', true) ->get();
[ { "title": "Start-Up", ... }, { "title": "Start the Revolution Without Me", ... }, ... ]
Retrieve Distinct Values
다음 예제에서는 distinct()
쿼리 빌더 메서드를 사용하여 movies
컬렉션에 있는 문서에 대해 year
필드의 다양한 값을 모두 조회하는 방법을 보여 줍니다.
$result = DB::table('movies') ->distinct('year')->get();
집계
이 섹션의 예제에서는 애그리게이션 을 수행하는 데 사용할 수 있는 쿼리 빌더 구문을 보여줍니다. 애그리게이션은 쿼리 결과 데이터 세트에서 값을 계산하는 작업입니다. 애그리게이션을 사용하여 다음 정보를 계산하고 반환할 수 있습니다.
공통 필드 값별로 그룹화된 결과 예시
다음 예제에서는 groupBy()
쿼리 빌더 메서드를 사용하여 runtime
필드의 공유 값별로 그룹화된 문서 데이터를 검색하는 방법을 보여 줍니다. 이 예에서는 G
의 rated
값을 포함하고 각 고유 runtime
값에 대해 한 영화의 title
필드를 포함하는 movies
컬렉션의 문서를 일치시키기 위해 다음 작업을 연결합니다.
where()
메서드를 사용하여"G"
의rated
필드 값을 포함하는 문서만 일치시킵니다.groupBy()
메서드를 사용하여_id
필드에 할당된runtime
필드의 고유 값을 기준으로 데이터를 그룹화합니다.orderBy()
메서드를 사용하여runtime
필드를 기준으로 그룹을 정렬합니다.get()
메서드에 지정하여 그룹화된 결과의 마지막 문서에서title
데이터를 반환합니다.
팁
groupBy()
메서드는 MongoDB $group
애그리게이션 연산자와 $last
축적자 연산자를 호출합니다. 이러한 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $group(애그리게이션) 을 참조하세요.
$result = DB::table('movies') ->where('rated', 'G') ->groupBy('runtime') ->orderBy('runtime', 'asc') ->get(['title']);
[ ... { "_id": { "runtime": 64 }, "runtime": 64, "title": "Stitch! The Movie" }, { "_id": { "runtime": 67 }, "runtime": 67, "title": "Bartok the Magnificent" }, { "_id": { "runtime":68 }, "runtime": 68, "title": "Mickey's Twice Upon a Christmas" }, ... ]
결과 수 예시
다음 예에서는 count()
쿼리 빌더 메서드를 사용하여 movies
컬렉션에 포함된 문서 수를 반환하는 방법을 보여 줍니다.
$result = DB::table('movies') ->count();
필드 예시의 최대값
다음 예에서는 max()
쿼리 빌더 메서드를 사용하여 전체 movies
컬렉션에서 runtime
필드의 가장 높은 숫자 값을 반환하는 방법을 보여 줍니다.
$result = DB::table('movies') ->max('runtime');
필드의 최소값 예제
다음 예에서는 min()
쿼리 빌더 메서드를 사용하여 전체 movies
컬렉션에서 year
필드의 가장 낮은 숫자 값을 반환하는 방법을 보여 줍니다.
$result = DB::table('movies') ->min('year');
필드 예시의 평균값
다음 예제에서는 avg()
쿼리 빌더 메서드를 사용하여 전체 movies
컬렉션에서 imdb.rating
값의 수치 평균 또는 산술 평균을 반환하는 방법을 보여 줍니다.
$result = DB::table('movies') ->avg('imdb.rating');
필드의 합계 값 예시
다음 예제에서는 sum()
쿼리 빌더 메서드를 사용하여 전체 movies
컬렉션에서 imdb.votes
값의 합계를 숫자로 반환하는 방법을 보여 줍니다.
$result = DB::table('movies') ->sum('imdb.votes');
일치하는 결과 집계 예시
다음 예는 쿼리와 일치하는 결과에서 데이터를 애그리게이션하는 방법을 보여줍니다. 이 쿼리는 2000
년 이후의 모든 영화를 일치시키고 avg()
메서드를 사용하여 해당 일치 항목의 imdb.rating
평균값을 계산합니다.
$result = DB::table('movies') ->where('year', '>', 2000) ->avg('imdb.rating');
쿼리 결과 수정
이 섹션에는 쿼리 결과의 순서와 형식을 수정하는 다음 함수에 대한 쿼리 빌더 예제가 포함되어 있습니다.
주문 결과 예시
다음 예에서는 orderBy()
쿼리 빌더 메서드를 사용하여 title
필드에 지정된 필터와 일치하는 결과를 imdb.rating
값을 기준으로 내림차순으로 정렬하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'like', 'back to the future%') ->orderBy('imdb.rating', 'desc') ->get();
[ { "title": "Back to the Future", "imdb": { "rating":8.5,"votes":636511,"id":88763 }, ... }, { "title": "Back to the Future Part II", "imdb": { "rating":7.8,"votes":292539,"id":96874 }, ... }, { "title": "Back to the Future Part III", "imdb": {"rating":7.4,"votes":242390,"id":99088 }, ... }, ... ]
지정된 수의 결과 생략 예시
다음 예에서는 skip()
쿼리 빌더 메서드를 사용하여 title
필드에 지정된 필터와 일치하는 처음 4개의 결과를 생략하고 year
값을 기준으로 오름차순으로 정렬하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'like', 'star trek%') ->orderBy('year', 'asc') ->skip(4) ->get();
결과 예제에 필드 및 배열 값의 하위 집합 표시
다음 예에서는 project()
쿼리 빌더 메서드를 사용하여 imdb.rating
값이 8.5
보다 큰 문서를 일치시키고 다음 필드 값만 반환하는 방법을 보여 줍니다.
영화 제목
title
cast
배열 필드의 두 번째 값부터 네 번째 값까지(있는 경우)자동으로 포함되는 문서
_id
필드
$result = DB::table('movies') ->where('imdb.rating', '>', 8.5) ->project([ 'title' => 1, 'cast' => ['$slice' => [1, 3]], ]) ->get();
[ { "_id": { ... }, "title": "City Lights" "cast": [ "Florence Lee", "Harry Myers", "Al Ernest Garcia" ], }, { "_id": { ... }, "title": "Modern Times", "cast": [ "Paulette Goddard", "Henry Bergman", "Tiny Sandford" ] }, { "_id": { ... }, "title": "Casablanca" "cast": [ "Ingrid Bergman", "Paul Henreid", "Claude Rains" ], }, ... ]
결과 페이지 매김 예시
다음 예제에서는 paginate()
쿼리 빌더 메서드를 사용하여 전체 movie
컬렉션을 15 문서의 불연속적인 결과 세트로 나누는 방법을 보여 줍니다. 이 예제에는 imdb.votes
필드를 기준으로 결과를 내림차순으로 정렬하는 정렬 순서와 결과에 특정 필드만 포함하는 프로젝션도 포함되어 있습니다.
$resultsPerPage = 15; $projectionFields = ['title', 'runtime', 'imdb.rating']; $result = DB::table('movies') ->orderBy('imdb.votes', 'desc') ->paginate($resultsPerPage, $projectionFields);
페이지 매김에 학습 보려면 페이지 매김 쿼리 빌더 결과 를 참조하세요. Laravel 문서에서 확인할 수 있습니다.
MongoDB 작업을 사용하여 데이터 검색
이 섹션에는 다음과 같은 MongoDB 관련 쿼리 작업을 사용하는 방법을 보여주는 쿼리 빌더 예제가 포함되어 있습니다.
필드 예시 포함
다음 예에서는 exists()
쿼리 빌더 메서드를 사용하여 random_review
필드가 포함된 문서를 일치시키는 방법을 보여 줍니다.
$result = DB::table('movies') ->exists('random_review', true);
이 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $exists 를 참조하세요.
모든 필드 포함 예시
다음 예에서는 all
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 사용하여 지정된 모든 필드가 포함된 문서를 일치시키는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('movies', 'all', ['title', 'rated', 'imdb.rating']) ->get();
이 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $all 을 참조하세요.
배열 크기 일치 예시
다음 예에서는 정확히 5개의 요소로 구성된 배열을 포함하는 directors
필드가 포함된 문서와 일치하도록 where()
쿼리 빌더 메서드와 함께 size
쿼리 연산자를 전달하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('directors', 'size', 5) ->get();
이 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $size 를 참조하세요.
데이터 유형 일치 예시
다음 예제에서는 type
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 전달하여 released
필드의 배열 데이터 유형에 해당하는 4
유형 값이 포함된 문서를 일치시키는 방법을 보여줍니다.
$result = DB::table('movies') ->where('released', 'type', 4) ->get();
유형 코드 및 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 $type 을 참조하세요.
모듈로 예제로 계산된 값 일치
다음 예에서는 year
필드의 짝수 값과 일치하는 표현식 year % 2 == 0
을 사용하여 문서를 일치시키기 위해 where()
쿼리 빌더 메서드와 함께 mod
쿼리 연산자를 전달하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('year', 'mod', [2, 0]) ->get();
이 쿼리 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $mod 를 참조하세요.
정규식 일치
다음 예에서는 지정된 정규 표현식과 일치하는 title
필드가 포함된 문서를 일치시키기 위해 where()
쿼리 빌더 메서드와 함께 REGEX
쿼리 연산자를 전달하는 방법을 보여 줍니다.
$result = DB::connection('mongodb') ->table('movies') ->where('title', 'REGEX', new Regex('^the lord of .*', 'i')) ->get();
MongoDB 의 정규 표현식 쿼리에 대해 자세히 알아보려면 MongoDB 서버 매뉴얼에서 $regex 를 참조하세요.
MongoDB 쿼리 API 작업 실행 예시
다음 예제에서는 whereRaw()
쿼리 빌더 메서드를 사용하여 MongoDB 쿼리 API 구문으로 작성된 쿼리 작업을 실행하는 방법을 보여 줍니다.
$result = DB::table('movies') ->whereRaw([ 'imdb.votes' => ['$gte' => 1000 ], '$or' => [ ['imdb.rating' => ['$gt' => 7]], ['directors' => ['$in' => [ 'Yasujiro Ozu', 'Sofia Coppola', 'Federico Fellini' ]]], ], ])->get();
다음 코드는 이에 상응하는 MongoDB 쿼리 API 구문을 보여줍니다.
db.movies.find({ "imdb.votes": { $gte: 1000 }, $or: [{ imdb.rating: { $gt: 7 }, directors: { $in: [ "Yasujiro Ozu", "Sofia Coppola", "Federico Fellini" ] } }]});
MongoDB MongoDB Query API MongoDB API에 API 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 참조하세요.
배열 요소 일치 예시
다음 예에서는 지정된 쿼리의 조건 중 하나 이상과 일치하는 배열 요소가 포함된 문서를 일치시키기 위해 where()
쿼리 빌더 메서드와 함께 elemMatch
쿼리 연산자를 전달하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('writers', 'elemMatch', ['$in' => ['Maya Forbes', 'Eric Roth']]) ->get();
MongoDB 의 정규 표현식 쿼리에 대해 자세히 알아보려면 MongoDB 서버 매뉴얼에서 $elemMatch 연산자 를 참조하세요.
커서 시간 초과 지정 예시
다음 예제에서는 timeout()
메서드를 사용하여 커서 작업이 완료될 때까지 대기할 최대 기간을 지정하는 방법을 보여 줍니다.
$result = DB::table('movies') ->timeout(2) // value in seconds ->where('year', 2001) ->get();
참고
이 설정은 maxTimeMS
값을 밀리초가 아닌 초 단위로 지정합니다. maxTimeMS
값에 대해 자세히 알아보려면 PHP 라이브러리 문서에서 MongoDBCollection::find() 을 참조하세요.
지리 공간적 작업을 사용하여 위치 일치
이 섹션의 예제에서는 GeoJSON 또는 좌표 쌍 데이터에 대한 지리 공간적 쿼리를 수행하여 다음 유형의 위치를 검색하는 데 사용할 수 있는 쿼리 빌더 구문을 보여 줍니다.
중요
MongoDB에서 GeoJSON 쿼리를 수행하려면 컬렉션에 2d
또는 2dsphere
인덱스를 생성해야 합니다. 지리 공간적 인덱스를 만드는 방법을 알아보려면 스키마 빌더 가이드의 지리 공간적 인덱스 만들기 섹션을 참조하세요.
GeoJSON 가 지원하는 객체에 대해 MongoDB 자세히 알아보려면 MongoDB Server 매뉴얼에서 객체 를 GeoJSON 참조하세요.
근거리 위치 예시
다음 예에서는 near
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 사용하여 GeoJSON 포인트 객체에서 최대 50
미터 떨어진 위치가 포함된 문서를 일치시키는 방법을 보여 줍니다.
$results = DB::table('theaters') ->where('location.geo', 'near', [ '$geometry' => [ 'type' => 'Point', 'coordinates' => [ -86.6423, 33.6054, ], ], '$maxDistance' => 50, ])->get();
이 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $near 연산자 를 참조하세요.
영역 내 예시
다음 예제에서는 geoWithin
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 사용하여 지정된 Polygon
GeoJSON 객체의 경계 내에 있는 위치가 포함된 문서를 일치시키는 방법을 보여 줍니다.
$results = DB::table('theaters') ->where('location.geo', 'geoWithin', [ '$geometry' => [ 'type' => 'Polygon', 'coordinates' => [ [ [-72, 40], [-74, 41], [-72, 39], [-72, 40], ], ], ], ])->get();
지오메트리 교차 예시
다음 예제에서는 geoInstersects
쿼리 연산자를 where()
쿼리 빌더 메서드와 함께 사용하여 지정된 LineString
GeoJSON 객체와 교차하는 위치가 포함된 문서를 일치시키는 방법을 보여 줍니다.
$results = DB::table('theaters') ->where('location.geo', 'geoIntersects', [ '$geometry' => [ 'type' => 'LineString', 'coordinates' => [ [-73.600525, 40.74416], [-72.600525, 40.74416], ], ], ])->get();
주변 일치 항목에 대한 근접 데이터 예시
다음 예에서는 geoNear
애그리게이션 연산자를 raw()
쿼리 빌더 메서드와 함께 사용하여 각 일치 항목에 대한 근접성 정보와 같은 메타데이터를 반환하는 애그리게이션을 수행하는 방법을 보여 줍니다.
$results = DB::table('theaters')->raw( function (Collection $collection) { return $collection->aggregate([ [ '$geoNear' => [ 'near' => [ 'type' => 'Point', 'coordinates' => [-118.34, 34.10], ], 'distanceField' => 'dist.calculated', 'maxDistance' => 500, 'includeLocs' => 'dist.location', 'spherical' => true, ], ], ]); }, )->toArray();
이 애그리게이션 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 $geoNear 연산자 를 참조하세요.
MongoDB 쓰기 작업을 사용하여 데이터 쓰기
이 섹션에는 다음과 같은 MongoDB 전용 쓰기 작업을 사용하는 방법을 보여주는 쿼리 빌더 예제가 포함되어 있습니다.
문서 예시 업로드
v4.7 부터 시작됩니다. 다음 쿼리 빌더 메서드 중 하나를 사용하여 업서트 작업을 수행할 수 있습니다.
upsert()
: 이 방법을 사용하면 배치 업서트 를 수행하여 한 번의 작업으로 여러 문서를 변경하거나 삽입할 수 있습니다.update()
: 이 메서드를 사용하는 경우 쿼리 필터하다 와 일치하는 모든 문서를 업데이트 하거나 일치하는 문서 를 삽입하려면upsert
옵션을 지정해야 합니다. 이 업서트 메서드만 v4.6 이전 버전에서 지원됩니다.
Upsert 메서드
upsert(array $values, array|string $uniqueBy, array|null
$update)
쿼리 빌더 메서드는 다음 매개변수를 허용합니다.
$values
: 업데이트 하거나 삽입할 문서를 지정하는 필드 및 값의 배열입니다.$uniqueBy
: 첫 번째 배열 매개변수에서 문서를 고유하게 식별하는 필드 목록입니다.$update
: 일치하는 문서 가 있는 경우 업데이트 할 필드의 선택적 목록입니다. 이 매개변수를 생략하면 Laravel 통합이 모든 필드를 업데이트합니다.
다음 예시 에서는 upsert()
쿼리 빌더 메서드를 사용하여 다음 지침에 따라 문서를 업데이트 하거나 삽입하는 방법을 보여 줍니다.
title
필드 의 값이'Inspector Maigret'
,recommended
필드 의 값이false
,runtime
필드 의 값이128
인 문서 를 지정합니다.title
필드 의 값이'Petit Maman'
,recommended
필드 의 값이true
,runtime
필드 의 값이72
인 문서 를 지정합니다.title
필드 가 작업 범위 내 문서를 고유하게 식별함을 나타냅니다.일치하는 문서에서
recommended
필드 만 업데이트합니다.
$result = DB::table('movies') ->upsert( [ ['title' => 'Inspector Maigret', 'recommended' => false, 'runtime' => 128], ['title' => 'Petit Maman', 'recommended' => true, 'runtime' => 72], ], 'title', 'recommended', );
upsert()
쿼리 빌더 메서드는 작업에서 업데이트, 삽입 및 수정한 문서 수를 반환합니다.
참고
upsert()
메서드는 이벤트를 trigger 하지 않습니다. 업서트 작업에서 이벤트를 trigger 하려면 createOrFirst()
메서드를 대신 사용할 수 있습니다.
업데이트 메서드
다음 예에서는 update()
쿼리 빌더 메서드 및 upsert
옵션을 사용하여 일치하는 문서를 업데이트하거나 지정된 데이터가 없는 경우 해당 문서를 삽입하는 방법을 보여 줍니다. upsert
옵션을 true
로 설정했는데 문서가 존재하지 않는 경우 명령은 데이터와 where()
쿼리 작업에 지정된 title
필드 및 값을 모두 삽입합니다.
$result = DB::table('movies') ->where('title', 'Will Hunting') ->update( [ 'plot' => 'An autobiographical movie', 'year' => 1998, 'writers' => [ 'Will Hunting' ], ], ['upsert' => true], );
update()
쿼리 빌더 메서드는 작업이 업데이트하거나 삽입한 문서 수를 반환합니다.
숫자 값 증가 예제
다음 예에서는 increment()
쿼리 빌더 메서드를 사용하여 일치하는 문서의 imdb.votes
필드 값에 3000
을(를) 추가하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'Field of Dreams') ->increment('imdb.votes', 3000);
increment()
쿼리 빌더 메서드는 작업이 업데이트한 문서 수를 반환합니다.
Laravel Integration v4.8 부터 시작됩니다. incrementEach()
쿼리 빌더 메서드를 사용하여 단일 작업으로 여러 값을 증가시킬 수도 있습니다. 다음 예시 에서는 incrementEach()
메서드를 사용하여 일치하는 문서 에서 awards.wins
및 imdb.votes
필드의 값을 늘립니다.
$result = DB::table('movies') ->where('title', 'Lost in Translation') ->incrementEach([ 'awards.wins' => 2, 'imdb.votes' => 1050, ]);
참고
값이 없거나 일치하는 문서에 존재하지 않는 increment()
또는 incrementEach()
메서드에 필드 를 전달하는 경우 이러한 메서드는 지정된 필드 를 증분 값으로 초기화합니다.
숫자 값 감소 예시
다음 예에서는 decrement()
쿼리 빌더 메서드를 사용하여 일치하는 문서의 imdb.rating
필드 값에서 0.2
를 빼는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'Sharknado') ->decrement('imdb.rating', 0.2);
decrement()
쿼리 빌더 메서드는 작업이 업데이트한 문서 수를 반환합니다.
Laravel Integration v4.8 부터 시작됩니다. decrementEach()
쿼리 빌더 메서드를 사용하여 단일 작업으로 여러 값을 줄일 수도 있습니다. 다음 예시 에서는 decrementEach()
메서드를 사용하여 일치하는 문서 에서 metacritic
및 imdb.rating
필드의 값을 줄입니다.
$result = DB::table('movies') ->where('title', 'Dunkirk') ->decrementEach([ 'metacritic' => 1, 'imdb.rating' => 0.4, ]);
참고
값이 없거나 일치하는 문서에 존재하지 않는 decrement()
또는 decrementEach()
메서드에 필드 를 전달하는 경우 이러한 메서드는 지정된 필드 를 감소분 값으로 초기화합니다.
배열 요소 추가 예제
다음 예에서는 push()
쿼리 빌더 메서드를 사용하여 일치하는 문서의 cast
배열 필드에 "Gary Cole"
을(를) 추가하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'Office Space') ->push('cast', 'Gary Cole');
push()
쿼리 빌더 메서드는 작업이 업데이트한 문서 수를 반환합니다.
배열 요소 제거 예제
다음 예에서는 pull()
쿼리 빌더 메서드를 사용하여 쿼리와 일치하는 문서의 genres
필드에서 "Adventure"
값을 제거하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'Iron Man') ->pull('genres', 'Adventure');
pull()
쿼리 빌더 메서드는 작업이 업데이트한 문서 수를 반환합니다.
필드 제거 예시
다음 예에서는 unset()
쿼리 빌더 메서드를 사용하여 쿼리와 일치하는 문서에서 tomatoes.viewer
필드와 값을 제거하는 방법을 보여 줍니다.
$result = DB::table('movies') ->where('title', 'Final Accord') ->unset('tomatoes.viewer');
unset()
쿼리 빌더 메서드는 작업이 업데이트한 문서 수를 반환합니다.