2016-11-06 84 views
0

我想提高我的網站上搜索,這是它目前的樣子(我用的NodeJS,Sequelize和PostgreSQL):Sequelize查詢多次

db.food.findAll({ 
     where: { 
      nameFood: { 
       $iLike: '%' + queryName + '%' 
      } 
     } 
    }).then(function (foods) { 
     foods.sort(compareFood); 

     res.json(foods); 
    }, function (e) { 
     res.status(500).send(); 
    }); 

我認爲這是非常自我解釋,但是如果有什麼不清楚的話,就問問我的意見。

現在,這個搜索算法考慮了WHOLE參數,因此搜索「雞蛋」將不會返回任何內容,因爲在我的數據庫中它們被保存爲「雞蛋」。

我一個快速的改進想法是將查詢尋找空間,然後查詢每個關鍵字,像:

var keywords = queryName.split(' '); 

有了,我有關鍵字,現在我怎麼能查詢可變數目的時間,並將結果加入到數組中以便像食物中那樣返回?

我檢查了文檔和一些問題在這裏,但找不到任何東西,任何幫助表示讚賞,非常感謝。

回答

3

您可以使用$or屬性查詢與「雞蛋」或「雞」匹配的任何內容。

下面是一個例子:

// split queryName by spaces 
var qry = queryName.split(' '); 

// convert each item into a $iLike object 
// ['chicken', 'eggs'] -> [{ $iLike: '%chicken%' }, { $iLike: '%eggs%' }] 
qry = qry.map(function(item) { 
    return { 
    $iLike: '%' + item + '%'; 
    }; 
}); 

db.food.findAll({ 
    where: { 
     nameFood: { $or: qry } 
    } 
}).then(function (foods) { 
    foods.sort(compareFood); 

    res.json(foods); 
}).catch(function (e) { 
    res.status(500).send(); 
}); 

希望這回答你的問題,但你走之前我也得到了一個很好的提示你,你可能會發現有用的。

其中之一是使用.catch函數接收任何錯誤。而不是.then的結果和錯誤,你可以離開.then來處理結果和.catch來處理錯誤。

db.food.findAll() 
    .then(function(results) { 

    }) 
    .catch(function(err) { 

    }); 

代替

db.food.findAll() 
    .then(function(results) { 

    }, function(err) { 

    }); 
+0

非常感謝你的好友:) – leofontes