49 votes

Comment définir des méthodes dans un modèle Mongoose ?

Mon locationsModel fichier :

mongoose = require 'mongoose'
threeTaps = require '../modules/threeTaps'

Schema = mongoose.Schema
ObjectId = Schema.ObjectId

LocationSchema =
  latitude: String
  longitude: String
  locationText: String

Location = new Schema LocationSchema

Location.methods.testFunc = (callback) ->
  console.log 'in test'

mongoose.model('Location', Location);

Pour l'appeler, j'utilise :

myLocation.testFunc {locationText: locationText}, (err, results) ->

Mais je reçois une erreur :

TypeError: Object function model() {
    Model.apply(this, arguments);
  } has no method 'testFunc'

51voto

pdoherty926 Points 3972

Vous n'avez pas précisé si vous cherchiez à définir des méthodes de classe ou d'instance. Puisque d'autres ont couvert les méthodes d'instance, voici comment on définit une classe/méthode statique :

animalSchema.statics.findByName = function (name, cb) {
    return this.find({ 
        name: new RegExp(name, 'i') 
    }, cb);
}

1 votes

Pour compléter votre réponse, voici un exemple d'utilisation (tiré de la même page) : var Animal = mongoose.model('Animal', animalSchema); Animal.findByName('fido', function (err, animals) {console.log(animals)}) ;

0 votes

Hourra pour la statique ! C'est ce que je cherchais

2 votes

This.find n'est pas défini. Quelle pourrait être la raison ?

33voto

iZ. Points 1077

Hmm - Je pense que votre code devrait ressembler davantage à ceci :

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

var threeTaps = require '../modules/threeTaps';

var LocationSchema = new Schema ({
   latitude: String,
   longitude: String,
   locationText: String
});

LocationSchema.methods.testFunc = function testFunc(params, callback) {
  //implementation code goes here
}

mongoose.model('Location', LocationSchema);
module.exports = mongoose.model('Location');

Ensuite, votre code d'appel peut exiger le module ci-dessus et instancier le modèle comme ceci :

 var Location = require('model file');
 var aLocation = new Location();

et accédez à votre méthode comme ceci :

  aLocation.testFunc(params, function() { //handle callback here });

0 votes

Désolé si j'ai mal compris, mais je ne vois pas en quoi cela diffère du code de l'OP.

0 votes

La même méthode peut-elle être utilisée en utilisant le shell mongoDB ?

0 votes

@Will, je pense que la différence est que iZ. applique la fonction au schéma et non au modèle.

20voto

Duncan_m Points 1055

Voir le Documents de Mongoose sur les méthodes

var animalSchema = new Schema({ name: String, type: String });

animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

1 votes

Le problème est que, dans mon exécution, je reçois le message "animal.findSimilarTypes n'est pas une fonction" !

0 votes

Dans mon cas, avec exactement le même exemple this.model est indéfinie. Savez-vous pourquoi ?

3 votes

Pour répondre à ma propre question, le problème vient du fait que j'ai utilisé une fonction flèche pour l'une des méthodes Schema, qui utilisait la portée du schéma et non le modèle d'instance lui-même.

1voto

user3573644 Points 29
Location.methods.testFunc = (callback) ->
  console.log 'in test'

devrait être

LocationSchema.methods.testFunc = (callback) ->
  console.log 'in test'

Les méthodes doivent faire partie du schéma. Pas du modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X