この記事では、主に Mongoose の仮想フィールド クエリの実装に関する関連情報をサンプル コードを通じて詳しく紹介します。必要な方は以下のエディターを参照してください。一緒に学びましょう。
前書き
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()
が呼び出されると、上記の validate 関数がコールバックされます。
クエリフックの追加
Mongoose は、hooks-js をさらにカプセル化しません。つまり、すべての Query メソッドにフックを設定することはできず、監視する必要があるメソッドを 1 つずつ列挙することしかできません。もちろん、これはコードの再利用には影響しません。
// 设置 findOne 和 find 钩子 CompanySchema.pre('findOne', preFind).pre('find', preFind);
次に、preFind関数の実装を始めます。
仮想クエリの実装
フック(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 中国語 Web サイトの他の関連記事を参照してください。