>  기사  >  웹 프론트엔드  >  Mongoose의 가상 필드 쿼리 구현 방법에 대한 자세한 설명

Mongoose의 가상 필드 쿼리 구현 방법에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-08-18 10:09:471750검색

이 글은 몽구스의 가상 필드 쿼리 구현에 대한 관련 정보를 주로 소개합니다. 이 글은 모든 사람의 학습이나 업무에 대한 특정 참조 학습 가치를 가지고 있으므로 아래 편집자를 따라갈 수 있습니다. .함께 배워봅시다.

머리말

mongoose가 데이터 모델에 대한 가상 속성을 제공하므로 C# 또는 Java의 접근자와 유사하게 모델 속성을 보다 일관되고 편리하게 읽고 쓸 수 있다는 것을 알고 계시는지 모르겠습니다. 실제로 MongoDB는 이러한 속성을 저장하지 않기 때문에 쿼리 단계에서 가상 속성을 찾아서는 안 된다는 것을 알고 있습니다. 그런데 가상 속성에 대한 쿼리를 인터셉터를 통해 구현할 수 있을까요?

이 질문은 많은 시나리오에서 흥미롭고 매우 편리합니다. 예:

  • 폭력적인 전체 텍스트 검색을 구현할 때 여러 필드는 가상 속성으로 추상화될 수 있는 통합 쿼리 단어와 일치해야 합니다.

  • 동일한 복잡한 조건 쿼리가 필요한 경우 여러 장소에서 쿼리 조건을 가상 속성으로 캡슐화할 수 있습니다.

사실 가상속성 쿼리와 가상속성 읽기, 쓰기는 모두 코드 재사용을 위한 것입니다.

Mongoose의 후크

Mongoose 스키마는 거의 모든 정적 메서드와 개체 메서드에 .pre 및 .post 후크를 추가합니다. 이러한 후크는 실제로 Hooks-js를 사용하여 구현된 함수 후크입니다.

공식 웹사이트의 예:


var hooks = require('hooks')
 , Document = require('./path/to/some/document/constructor');
// Add hooks' methods: `hook`, `pre`, and `post`
for (var k in hooks) {
 Document[k] = hooks[k];
}
// Define a new method that is able to invoke pre and post middleware
Document.hook('save', Document.prototype.save);

// 上述代码在mongoose中实现
/////////////////////////////////////////////////////////////////////
// 下面的代码则是mongoose提供的Hook API

// Define a middleware function to be invoked before 'save'
Document.pre('save', function validate(next) {
 // ...
});

Document.save()이 호출되면 위의 유효성 검사 함수가 다시 호출됩니다.

쿼리 후크 추가

Mongoose는 Hooks-js를 더 이상 캡슐화하지 않습니다. 즉, 모든 쿼리 메서드에 대한 후크를 설정할 수 없으며 하나씩 모니터링해야 하는 메서드만 열거할 수 있다는 의미입니다. 물론 이는 코드 재사용에 영향을 미치지 않습니다.


// 设置 findOne 和 find 钩子
CompanySchema.pre('findOne', preFind).pre('find', preFind);

다음으로 preFind 기능 구현을 시작하겠습니다.

가상 쿼리 구현

Hook(preFind)에서는 쿼리 조건을 변경하여 가상 쿼리를 구현할 수 있습니다. 완전히 제어 가능한 쿼리는 모든 형태의 가상 쿼리를 구현할 수 있다는 것을 의미한다는 점은 주목할 가치가 있습니다.

예: 전체 텍스트 검색:


function preFind() {
 var word = this.getQuery().word;
 if(word === undefined) return;

 // 从真实的Query中删掉虚拟属性
 delete this._conditions.word;
 // 构造正则表达式
 var regex = new RegExp(word);
 // 全文检索
 this.where({ $or: [{ title: regex }, { content: regex }, { author: regex }] });
}

위 내용은 Mongoose의 가상 필드 쿼리 구현 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.