2011-09-14 21 views
32

Mi locationsModel archivo:¿Cómo se definen los métodos en un modelo Mongoose?

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); 

llamarlo, que estoy usando:

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

pero me da un error:

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

Respuesta

24

Hmm - Creo que su código debe ser se parece más a esto:

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'); 

A continuación, el código de llamada puede requerir el módulo de arriba y una instancia del modelo así:

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

y accede a tu método como este:

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

Lo siento si estoy leyendo mal aquí, pero no veo cómo esto difiere del código OPs. – Will

+0

¿Se puede usar el mismo método de alguna manera con el shell mongoDB? – p0lAris

+0

@ Will, creo que la diferencia es que iZ. está aplicando la función al Esquema, no al Modelo. – kim3er

15

Ver el Mongoose docs on methods

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

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

+1 para el enlace a la documentación – allenhwkim

+1

El problema es que, en mi ejecución, aparece el mensaje "animal.findSimilarTypes no es una función". –

+0

En mi caso, con el mismo ejemplo exacto'this.model' no está definido. ¿Alguna idea de por qué? –

35

No especificó si estaba buscando definir métodos de clase o instancia. Dado que otros han cubierto los métodos de instancia, here's cómo definiría un método de clase/estática:

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

Solo para completar su respuesta, este es el ejemplo de uso (de la misma página): 'var Animal = mongoose.model ('Animal', animalSchema);' Animal.findByName ('fido', función (err, animals) {console .log (animales)}); –

+0

¡Hurra por estática! Eso es lo que estaba buscando – Vaiden

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

debería ser

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

Los métodos tienen que ser parte del esquema. No es el modelo.

Cuestiones relacionadas