使用mongoose按国家和自由文本搜索mongodb进行筛选

时间:2017-02-05 11:25:40

标签: javascript node.js mongodb

我在mongodb中有如下文档,

enter image description here

我的架构如下,

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;

我正在尝试查询国家/地区的文件"澳大利亚"并包括说明中的文字" Ade"。但是以下查询返回空结果集,而大约有15个文档。

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

这就是我调用查询的方式,

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

1 个答案:

答案 0 :(得分:2)

首先,我希望您知道要执行基于$text的查询,您需要在该特定字段上拥有text based index

其次,你似乎混淆了回调和承诺 -

正如我所看到的那样,query()函数在您调用query()函数时仍会返回一个承诺,而您正在期待回调。承诺会立即返回给您,然后您需要解决它们。

您的代码应如下所示 -

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
}

详细了解承诺 here

我注意到的另一个小错误是query()方法。 if statement不使用大括号,因此只有在if statement子句下执行if之后的下一个语句。 if之后的第二个语句将始终执行 -

所以,

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

应该是 -

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

我仍然不确定所有这些都能使你的代码工作,因为我无法在这里看到整个图片。我恕我直言,建议您投入更多时间来涵盖javascript和MongoDB基础知识。将帮助您节省大量时间。就此而言,MongoDB的official docs非常好。