2011-09-14 12 views
32

mio locationsModel di file:Come si definiscono i metodi in un modello 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); 

chiamarlo, sto usando:

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

ma ottengo un errore:

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

risposta

24

Hmm - penso che il codice dovrebbe essere più simile a questa:

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

Allora il vostro codice chiamante può richiedere il modulo di cui sopra e istanziare il modello come questo:

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

e accedi al tuo metodo come questo:

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

Scusate se sto leggendo male qui, ma non vedo come questo differisca dal codice OPs. – Will

+0

È possibile utilizzare lo stesso metodo in qualche modo usando la shell mongoDB? – p0lAris

+0

@Sarà, penso che la differenza sia che iZ. sta applicando la funzione allo Schema e non al Modello. – kim3er

15

Vedere la 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 per il collegamento alla documentazione – allenhwkim

+1

Il problema è che, nella mia esecuzione, ottengo il messaggio "animal.findSimilarTypes is not a function"! –

+0

Nel mio caso, con lo stesso esatto esempio, "questo modello" non è definito. Qualche idea del perché? –

35

Non hai specificato se stavi cercando di definire i metodi di classe o di istanza. Dal momento che gli altri hanno coperto metodi di istanza, here's come si sarebbe definire un metodo di classe/static:

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

Solo per completare la risposta questo è un esempio di utilizzo (dalla stessa pagina): 'var Animal = mongoose.model ('Animal', animalSchema);' Animal.findByName ('fido', function (err, animals) {console log (animali)}); –

+0

Urrà per statico! Quello che stavo cercando – Vaiden

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

dovrebbe essere

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

I metodi devono essere una parte dello schema. Non il modello.

Problemi correlati