Filtrar por país y búsqueda de texto libre mongodb usando mongoose

Tengo el documento en mongodb como sigue,

introduzca la descripción de la imagen aquí

Mi esquema es el siguiente,

var mongoose = require('mongoose'); var eventSchema = new mongoose.Schema({ description: { type: String }, end_time: { type: Date }, start_time: { type: Date }, name: { type: String }, place: { type: mongoose.Schema.Types.ObjectId, ref: 'Location' } }); eventSchema.index({description: 'text'}); module.exports= Event; 

Estoy intentando consultar los documentos donde el país es “Australia” e incluye texto en la descripción “Ade”. pero la siguiente consulta devuelve un conjunto de resultados vacío, mientras que hay alrededor de 15 documentos.

 query : function(model, conditon,options) { return new Promise(function(resolve, reject) { options = options||{}; console.log("model is" + model); model.find(conditon, {}, options, function(error, data) { if (error) console.log(error); reject(error); resolve(data); }) }) } 

Así es como llamo a la consulta,

 dbHelper.query(mongoose.model('events'), {$text: {$search: "Ade"},'place.location.country': "Australia"},function(error,data){ callback(data); }); 

En primer lugar, espero que sepa que para realizar $text consultas basadas en $text necesita tener un índice basado en texto en ese campo en particular.

En segundo lugar, parecen estar confundiendo devoluciones de llamada y promesas –

Como puedo ver, su función de query() está devolviendo una promesa aún cuando está llamando a la función de query() está esperando la callback. Las promesas son devueltas inmediatamente a usted y luego necesita resolverlas.

Tu código debería verse así:

 dbHelper.query(mongoose.model('events'), {$text: {$search: "Ade"},'place.location.country': "Australia"}) .then(function(result)){ // you have your data here } .catch(function(err)){ // an error occured } 

Lea más sobre Promesas aquí .

Otro error menor que puedo notar es en el método query() . La if statement no usa llaves y, como resultado, solo la siguiente instrucción posterior a la if statement se ejecutará bajo la cláusula if . La segunda afirmación después del if siempre será ejecutada –

Asi que,

 if(error) console.log(error); // always executed reject(error); resolve(data); 

debiera ser –

 if(error){ console.log(error); reject(error); } resolve(data); 

Todavía no estoy seguro de que todo esto pueda hacer que su código funcione, ya que no puedo ver la imagen completa aquí. En mi opinión, le recomiendo que invierta algo más de tiempo en cubrir los conceptos básicos de javascript y MongoDB. Te ayudará a ahorrar mucho tiempo. Y para el caso, los documentos oficiales de MongoDB son realmente buenos.