我在mongodb中有如下文档,
我的架构如下,
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);
});
答案 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非常好。