Maison >interface Web >js tutoriel >Explication détaillée de la méthode d'implémentation des requêtes de champ virtuel de Mongoose

Explication détaillée de la méthode d'implémentation des requêtes de champ virtuel de Mongoose

巴扎黑
巴扎黑original
2017-08-18 10:09:471840parcourir

Cet article vous présente principalement les informations pertinentes sur la mise en œuvre de la requête de champ virtuel par Mongoose. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. Les amis qui en ont besoin peuvent le suivre ci-dessous. .Apprenons ensemble.

Préface

Je ne sais pas si vous savez que mangouste fournit des attributs virtuels pour le modèle de données, afin qu'il puisse être plus cohérent et des propriétés de modèle de lecture et d'écriture pratiques, similaires aux accesseurs en C# ou Java. Nous savons que les attributs virtuels ne doivent pas être trouvés dans l'étape Query, car en fait MongoDB ne stocke pas ces attributs. Mais la requête d’attributs virtuels peut-elle être implémentée via un intercepteur ?

Cette question est intéressante et assez pratique dans de nombreux scénarios. Par exemple :

  • Lors de la mise en œuvre d'une recherche violente en texte intégral, vous devez faire correspondre plusieurs champs avec un terme de requête unifié, qui peut être résumé dans un attribut virtuel

  • Lorsque vous devez interroger la même condition complexe à plusieurs endroits, vous pouvez utiliser des attributs virtuels pour encapsuler la condition de requête.

En fait, la requête d'attributs virtuels et la lecture et l'écriture d'attributs virtuels sont toutes destinées à la réutilisation du code.

Hooks dans Mongoose

Mongoose Schema ajoute des hooks .pre et .post à presque toutes les méthodes statiques et méthodes objet. Ces hooks sont en fait des hooks de fonction, implémentés à l’aide de hooks-js.

Exemple tiré du site officiel :


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) {
 // ...
});
Lorsque

est appelé, la fonction de validation ci-dessus sera appelée dos . Document.save()

Ajouter des hooks de requête

Mongoose n'encapsule pas davantage hooks-js, ce qui signifie que nous ne pouvons pas définir de hooks pour toutes les méthodes de requête, uniquement pour List les méthodes qui doivent être surveillées une par une. Bien entendu, cela n’affecte pas la réutilisation de notre code.


// 设置 findOne 和 find 钩子
CompanySchema.pre('findOne', preFind).pre('find', preFind);
Ensuite, nous commençons à implémenter la fonction preFind.

Implémentation d'une requête virtuelle

Dans le hook (preFind), nous pouvons modifier les conditions de requête pour implémenter une requête virtuelle. Il convient de noter que la requête entièrement contrôlable signifie que nous pouvons implémenter n'importe quelle forme de requête virtuelle.

Par exemple, recherche en texte intégral :


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn