Quiero definir un método en mi modelo que implique buscar en los documentos del mismo modelo, esto es lo que probé:
var mongoose = require('mongoose'); var Author = require('./author.js'); var bookSchema = mongoose.Schema({ author : { type: mongoose.Schema.Types.ObjectId, ref: 'author' }, genre: String, }); bookSchema.methods.findSimilar = function(callback) { bookSchema.find({'genre': this.genre}).exec(function doThings(err, doc){ /* ... */ }); }; module.exports = mongoose.model('book', bookSchema, 'book'); Sin embargo, obtengo TypeError: bookSchema.find is not a function .
También probé bookSchema.methods.find() , mismo resultado. ¿Cómo puedo arreglar esto?
Gracias,
Editar: inspirado por esta respuesta , también probé this.model('Book').find() , pero aparece un error similar: TypeError: this.model is not a function
Cambie su método a: (Supongo que ya exportó el libro modelo de su módulo de esquema.
bookSchema.methods.findSimilar = function(callback) { this.model('Book').find({'genre': this.genre}).exec(function doThings(err, doc){ /* ... */ }); // Or if Book model is exported in the same module // this will work too: // Book.find({'genre': this.genre}).exec(function doThings(err, doc){ // /* ... */ // // }); };El método estará disponible en la instancia de su modelo:
var book = new Book({ author: author_id, genre: 'some_genre' }); // Or you could use a book document retrieved from database book.findSimilarTypes(function(err, books) { console.log(books); });Ver documentación aquí .
EDITAR (esquema completo/código de modelo)
El código completo del esquema/modelo será el siguiente:
var mongoose = require('mongoose'); var Author = require('./author.js'); var BookSchema = mongoose.Schema({ author : { type: Schema.Types.ObjectId, ref: 'Author' }, genre: String, }); BookSchema.methods.findSimilar = function(callback) { Book.find({genre: this.genre}).exec(function doThings(err, doc){ /* ... */ }); }; const Book = module.exports = mongoose.model('Book', BookSchema);Ejemplo de uso:
var book = new Book({ author: author_id, genre: 'some_genre' }); // Or you could use a book document retrieved from database book.findSimilarTypes(function(err, books) { console.log(books); });Olvidó escribir una nueva palabra clave, así que haga esto:
var bookSchema = new mongoose.Schema({ author : { type: mongoose.Schema.Types.ObjectId, ref: 'author' }, genre: String, });Salud:)