닉 Karnik
구스는 개체는 데이터 모델링(ODM)라이브러리에 대한 MongoDB 및 노드입니다.js 입니다. 그것은 사이의 관계를 관리하는 데이터,스키마 유효성 검사를 제공하며,사용되는 번역하는 물체 사이에 코드고의 표현에 있는 객체 MongoDB.
MongoDB 는 스키마 NoSQL 문서 데이터베이스입니다., 그것이 의미를 저장할 수 있습 JSON 문서에서,그리고 구조를 이러한 문서를 변경할 수 있도 적용되지 않습 SQL 데이터베이스가 있습니다. 이는 응용 프로그램 개발 속도를 높이고 배포의 복잡성을 줄이므로 NoSQL 을 사용하는 장점 중 하나입니다.
아래의 예는 데이터가 저장되는 방법에 몽고 대한 SQL 데이터베이스
용어
컬렉션
‘컬렉션에서’몽고가 해당하는 테이블에서는 관계형 데이터베이스가 있습니다. 여러 JSON 문서를 보유 할 수 있습니다.
문서
‘문서’는 sql 의 레코드 또는 데이터 행과 같습니다. SQL 행은 다른 테이블의 데이터를 참조 할 수 있지만 Mongo 문서는 일반적으로 문서에서 해당 데이터를 결합합니다.
필드
‘필드’또는 속성은 SQL 테이블의 열과 유사합니다.
스키마
Mongo 는 스키마가없는 반면 sql 은 테이블 정의를 통해 스키마를 정의합니다., 몽구’키’문서 데이터 구조(또는 모양의 문서)에 적용되는 응용 프로그램을 통해 계층입니다.
모델
‘모델의 것은 높은 순서 생성자를는 스키마와 인스턴스를 만들어 문서의 해당 기록이 관계형 데이터베이스에서.
시작하기
몽고 설치
우리가 시작하기 전에,하자 설정 몽고 있습니다., 중 하나를 선택할 수 있습니다 다음 옵션(우리가 사용하는 옵션 1 을 위해 이 문서에서):
- 다운로드를 적절한 MongoDB 버전에서 운영 체제에 대한 MongoDB 웹사이트와 그들의 설치 방법
- 성 샌드박스는 데이터베이스 구독 mLab
- 설치하고 사용 Docker 사용하는 것을 선호하는 경우커
자의 탐색을 통해 기초의 일부 몽구를 구현하여 모델을 나타내는 데이터에 대한 단순 주는 책입니다.
Visual Studio 코드,노드 8.9 및 NPM5.6 을 사용하고 있습니다., 좋아하는 IDE 를 발사하고,빈 프로젝트를 만들고,시작하자! 우리는 Node 에서 제한된 ES6 구문을 사용하게 될 것이므로 Babel 을 구성하지 않을 것입니다.
NPM
의 프로젝트 폴더와 우리의 초기화 프로젝트
npm init -y
의 설치하 몽구 및 유효성 검사 라이브러리와 함께 다음과 같은 명령:
npm install mongoose validator
위의 설치를 명령이 최신 버전을 설치하의 라이브러리입니다. 이 기사의 몽구스 구문은 몽구스 v5 와 그 이후의 특정 구문입니다.,
데이터베이스 연결
프로젝트 루트 아래에./src/database.js
파일을 만듭니다.
다음으로 데이터베이스에 연결하는 메소드가있는 간단한 클래스를 추가 할 것입니다.
설치에 따라 연결 문자열이 달라집니다.위의
require(‘mongoose’)
호출은 싱글 톤 객체를 반환합니다. 그것은require(‘mongoose’)
를 처음 호출 할 때 몽구스 클래스의 인스턴스를 만들고 반환한다는 것을 의미합니다., 에 대한 후속 호출이 반환됩니다 동일한 인스턴스를 만들어진 당신에게 반환 첫번째 방식 때문에 모듈을 가져오기/내보내에서 작동 ES6.
마찬가지로,우리는 우리의 데이터베이스로 단일하여 반 클래스의 인스턴스module.exports
문의하기 때문에 우리는 우리 하나만 필요한 데이터베이스에 연결.,
ES6 것은 매우 쉽게 우리를 만드는 단일(single instance)패턴이 어떻게 때문에 모듈의 작동 로더 캐싱하여 응답에 이전에 수입된 파일입니다.
몽구스 스키마 대 모델
몽구스 모델은 몽구스 스키마의 래퍼입니다. 몽구스 스키마는 문서의 구조,기본값,유효성 검사기 등을 정의합니다. 반면 몽구스 모델은 레코드 생성,쿼리,업데이트,삭제 등을 위해 데이터베이스에 인터페이스를 제공합니다.
몽구스 모델을 만드는 것은 주로 세 부분으로 구성됩니다.
1., 참조 Mongoose
let mongoose = require('mongoose')
이 참조하는 것과 동일 하나는 반환되었을 때 우리는 데이터베이스에 연결되어 있는 의미는 스키마 모델의 정의는 필요하지 않습니다 명시적으로 데이터베이스에 연결합니다.
2. 스키마 정의
스키마는 키 이름이 컬렉션의 속성 이름에 해당하는 개체를 통해 문서 속성을 정의합니다.,
let emailSchema = new mongoose.Schema({ email: String})
여기서 우리는 정의 속성이라는 이메일로 스키마 형식 문자열을 매핑하고 내부 검사가 트리거 될 때의 모델 데이터베이스에 저장됩니다. 값의 데이터 유형이 문자열 유형이 아닌 경우 실패합니다.
스키마 다음과 같은 종류가 허용된다.
- 배열
- Boolean
- 버퍼
- 날짜
- 혼합(일반/유연한 데이터 유형)
- 번호
- 모든 요청에 필
- 문자열
혼합하고 모든 요청에 필에 정의된require(‘mongoose’).Schema.Types
.
3., 모델 내보내기
몽구스 인스턴스에서 모델 생성자를 호출하고 컬렉션의 이름과 스키마 정의에 대한 참조를 전달해야합니다.
module.exports = mongoose.model('Email', emailSchema)
자의 결합 위의 코드로./src/models/email.js
의 내용을 정의 기본 이메일 model:
A schema definition,간단해야 하지만 그 복잡성은 일반적으로 기반의 응용 프로그램에서 요구 사항입니다. 스키마는 재사용 할 수 있으며 여러 자식 스키마도 포함 할 수 있습니다. 위의 예에서 전자 메일 속성의 값은 간단한 값 유형입니다., 그러나 그 위에 추가 속성이있는 객체 유형 일 수도 있습니다.
우리는 우리의 인스턴스를 만들 수 있 모델 우리가 위에서 정의 채우고 그것을 사용하여 구문은 다음과 같습니다.
let EmailModel = require('./email')let msg = new EmailModel({ email: '[email protected]'})
의을 강화 전자 메일의 스키마를 확인 이메일의 속성,독특한 필수 필드 값을 변환하는 소문자로 저장하기 전에. 값이 유효한 이메일 주소인지 확인하는 유효성 검사 기능을 추가 할 수도 있습니다. 이전에 설치 한 유효성 검사기 라이브러리를 참조하고 사용할 것입니다.,
기본 작업
몽구스는 유연한 API 를 가지고 있으며 작업을 수행 할 수있는 여러 가지 방법을 제공합니다. 우리는 초점을 맞추지 않을 것입에 변형이기 때문에 그 범위를 벗어납니다 이 문서에서는,하지만 기억하는 대부분의 작업에서 할 수 있는 하나 이상의 방법 중 하나 구문을 통해 또는 응용 프로그램을 포함됩니다.,
레코드 만들기
의 인스턴스를 만들의 이메일 모델을 저장하는 데이터베이스
결과는 문서를 반환되는 것에 성공적인 저장:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
다음 필드를 반환되는(내부 필드는 밑줄로 시작):
-
_id
필드를 자동으로 생성되 몽고와 기본 키의 컬렉션입니다. 그 값은 문서의 고유 식별자입니다. -
email
필드의 값이 반환됩니다., 스키마에서lowercase:true
특성을 지정했기 때문에 낮은 케이스임을 알 수 있습니다. -
__v
는 몽구스가 처음 만들 때 각 문서에 설정된 versionKey 속성입니다. 그 값에는 문서의 내부 개정판이 포함되어 있습니다.
위의 저장 작업을 반복하려고하면 이메일 필드가 고유해야한다고 지정했기 때문에 오류가 발생합니다.
레코드 가져 오기
이전에 데이터베이스에 저장 한 레코드를 검색 해 보겠습니다., 모델 클래스는 데이터베이스에서 작업을 수행하기 위해 여러 정적 및 인스턴스 메소드를 노출합니다. 이제 찾기 방법을 사용하여 이전에 만든 레코드를 찾고 이메일을 검색어로 전달하려고합니다.
EmailModel .find({ email: '[email protected]' // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
이 문서는 반환되는 것과 비슷한 것은 무엇이었을 때 표시되 우리가 만들어 레코드:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
업데이트 레코드
의 레코드를 수정하여 위의 변경 이메일 주소와 다른 추가 필드 그것을,모든 하나의 작업입니다., 성능상의 이유로,몽구스을 반환하지 않습 업데이트된 문서에 그래서 우리는 전달해야는 추가적인 매개 변수를 요구한다:
이 문서는 반환되는 것을 포함한 업데이트된 이메일:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
레코드 삭제
우리가 사용하는findOneAndRemove
호출 기록을 삭제., 반환된 원본 문서가 제거되었다.
Helpers
우리는 몇 가지의 기본적인 기능을 위으로 알려진 CRUD(을 만들고,읽고,업데이트하고,삭제)를 운영하지만,구스도를 구성하는 기능을 제공합 여러 가지 형태의 도우미 방법 및 속성이 있습니다. 이를 사용하여 데이터 작업을 더욱 단순화할 수 있습니다.
를 만들자는 사용자 스키마에서./src/models/user.js
필드firstName
및lastName
가상 속성
가상 속성을 유지하는 데이터베이스입니다., 우리는 값을 얻고 설정하는 도우미로 스키마에 추가 할 수 있습니다.
자들의 재산이라는fullName
사용할 수 있는 값을 설정하려면에서firstName
및lastName
고 그들을 검색 결합된 값을 읽을 때:
콜백을 얻을 설정해야합 기능을 사용하는 키워드로는 우리가 액세스하는 데 필요 모델을 통한this
키워드를 사용합니다. Fat arrow 함수를 사용하면this
가 참조하는 내용이 변경됩니다.,
이제,우리는 설정할 수 있습니다firstName
및lastName
가치를 할당해fullName
위의 코드를 출력하여 다음과 같다:
{ _id: 5a7a4248550ebb9fafd898cf, firstName: 'Thomas', lastName: 'Anderson' } Thomas Anderson
인스턴스는 방법
우리가 만들 수 있는 사용자 정의 도우미는 방법은 스키마에스 모델을 통해 인스턴스입니다. 이 메소드는 모델 객체에 액세스 할 수 있으며 매우 창의적으로 사용할 수 있습니다. 예를 들어 현재 인스턴스와 동일한 이름을 가진 모든 사람들을 찾는 메소드를 만들 수 있습니다.,이 예제에서는 현재 사용자의 이니셜을 반환하는 함수를 만들어 보겠습니다. 자가 사용자 정의 도우미라는 방법을getInitials
스키마
userSchema.methods.getInitials = function() { return this.firstName + this.lastName}
이 방법을 통해 액세스할 수 있는 모형 인스턴스
정적 방법
비슷한 인스턴스 방법을 만들 수 있습니다 정적 방법에 스키마., 만들자를 검색하는 메소드는 모든 사용자가 데이터베이스에서:
전화getUsers
모델 등을 반환 모든 사용자에게 데이터베이스
UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })
추가 인스턴스와 정적 방법입니다 좋은 접근 방식을 인터페이스를 구현하여 데이터베이스에 상호 작용을 컬렉션 및 기록합니다.
미들웨어
미들웨어는 파이프 라인의 특정 단계에서 실행되는 함수입니다., 몽구 지원을 위한 미들웨어 다음과 같은 작업:
- Aggregate
- Document
- 모델
- 쿼리
예를 들어,모델pre
및post
기능을 두 개의 매개변수:
- 형식의 이벤트가(‘init’,’확인’,’저장’,’제거’)
- 콜백으로 실행되는 이 참조하는 모형 인스턴스
의 예를 들어 추가하여 두 개의 분야이라고createdAt
및updatedAt
는 우리의 스키마
경model.save()
라 가 있pre(‘save’, …)
및post(‘save’, …)
는 이벤트가 트리거됩니다. 두 번째 매개 변수의 경우 이벤트가 트리거 될 때 호출되는 함수를 전달할 수 있습니다. 이러한 함수는 매개 변수를 미들웨어 체인의 다음 함수로 가져갑니다.,
추가 할 수 pre-저장을 걸이와 값을 설정한createdAt
및updatedAt
자 생성 및 저장을 우리는 모델:
당신이 볼 수 값을createdAt
및updatedAt
경우 기록을 만들어진 인쇄한다.
플러그인
가 우리가 원하는 트랙 기록을 만들어졌고 마지막 업데이트에 모든 컬렉션에서 우리의 데이터베이스입니다. 위의 과정을 반복하는 대신 플러그인을 만들어 모든 스키마에 적용 할 수 있습니다.,
의 파일을 만들는./src/model/plugins/timestamp.js
로 복제하고 위의 기능을 재사용할 수 있는 모듈:
이 플러그인을 사용하려면,우리는 단순히 전달하는 스키마를 부여해야 이 기능:
쿼리 빌딩
구스가 매우 풍부한 API 를 처리하는 많은 복잡한 작업을 지원하는 MongoDB. 쿼리 구성 요소를 점진적으로 빌드 할 수있는 쿼리를 고려하십시오.,
이 예제에서,우리는:
- 을 찾아 모든 사용자
- Skip 첫 번째 100 레코드
- 제한 결과 10 개의 레코드
- 결과를 정렬하여 이름 필드
- 선택 이름
- 실행하는 쿼리
닫기
우리는 거의 표면을 긁어를 탐험의 일부 기능을 Mongoose. 그것은 풍부한 전체 라이브러리의 유용하고 강력한 기능이 작동하는 기쁨과 데이터 모델 응용 프로그램에서 레이어입니다.,
하는 동안 당신은 상호 작용할 수 있습을 가진 몽고 직접 사용하여 몽고 드라이버,몽구스를 단순화는 상호 작용할 수 있도록 함으로써 모형 간의 관계 데이터 및 유효성을 검사합니다.
재미있는 사실:몽구스는 믿을 수 없을만큼 재능있는 엔지니어 발레리 Karpov 에 의해 만들어집니다! 그는 평균 스택이라는 용어를 만들었습니다.