mongoDB - 使用node.js在多个字段中搜索文本

时间:2015-12-12 21:55:07

标签: node.js mongodb heroku

我正在尝试使用连接到MongoDB数据库的Node.JS(全部托管在heroku上,因此使用MongoLab插件)来执行文本搜索。我想搜索我的文档中的某些字段(字符串或字符串数​​组,但我可以将它们更改为所有需要的字符串)。

以下代码希望能够搜索关键字变量的'title'字段或'ingredients'字段,然后返回这些结果。 我怀疑ensureIndex行(同时尝试ensureIndexcreateIndex),因为删除它们不会改变程序的功能。

任何帮助将不胜感激!

app.get('/searchtitle', function(request, response) {
    response.header("Access-Control-Allow-Origin", "*");
    response.header("Access-Control-Allow-Headers", "X-Requested-With");
    response.set('Content-Type', 'application/json');

    var type = request.query.type;
    var keyword = request.query.keyword;

    if (type == 'title') {
        db.collection('Test_Recipes').ensureIndex( { title: "text" } );
        db.collection('Test_Recipes').find({ 
        $text: {$search: keyword } 
       }).toArray(function(err, results){ 
       response.send(JSON.stringify(results)) });
    } 
    else {
        console.log("in else case: type is " 
               + type + " and keyword is " +keyword);
        db.collection('Test_Recipes').ensureIndex({ingredients :"text"});
        db.collection('Test_Recipes').find({ 
       ingredients: {$elemMatch: keyword } })
       .toArray(function(err, results){
       response.send(JSON.stringify(results)) });
    } 
}

1 个答案:

答案 0 :(得分:0)

Indexes,与任何数据库一样,只需在首次创建collection时创建一次。索引创建是一项代价高昂的操作和blocking操作。

mongoDB 3.0开始,方法createIndex()ensureIndex()之间没有区别,并且它们中的任何一个都应该用于在集合上创建索引,只在服务器端创建一次,当创建集合并仅在需要时进行修改。

要为titleingredients字段编制索引,您需要在集合上创建index

db.collection.createIndex({"ingredients":"text","title":"text"})

这将确保在插入文档时两个字段均为indexed

  

我对ensureIndex行表示怀疑(同时尝试了ensureIndex和   createIndex)因为删除它们不会改变功能   该计划。任何帮助将不胜感激!

这是因为createIndex()操作的行为方式。 如果索引再次在同一字段上创建,则只有第一次调用此方法才会成功,而其他调用只会被忽略。

然后只是查询,如下所示将查询keywordtitle字段中的ingredients

var type = request.query.type;
var keyword = request.query.keyword;
db.collection('Test_Recipes').find({ 
$text: {$search: keyword }
}).toArray(function(err, results){
response.send(JSON.stringify(results)) 
});