이 글은 몽구스의 가상 필드 쿼리 구현에 대한 관련 정보를 주로 소개합니다. 이 글은 모든 사람의 학습이나 업무에 대한 특정 참조 학습 가치를 가지고 있으므로 아래 편집자를 따라갈 수 있습니다. .함께 배워봅시다.
머리말
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!