多次序列化查询

Sequelize query multiple times

我正在尝试改进我网站上的搜索,这是它目前的样子(我使用 NodeJS、Sequelize 和 PostgreSQL):

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

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

我认为这是不言自明的,但如果有什么不清楚的地方,请在评论中问我。

现在,此搜索算法考虑了 WHOLE 参数,因此搜索 "chicken eggs" 将 return 没有任何结果,因为在我的数据库中它们被保存为 "eggs"。

我的快速改进想法是拆分查询以查找空格,然后查询每个关键字,例如:

var keywords = queryName.split(' ');

这样我就有了关键字,现在我如何查询可变次数并将结果加入一个数组中,以便像食品中的那样 returned?

我在这里查看了文档和一些问题,但找不到任何内容,非常感谢任何帮助,非常感谢。

您可以使用 $or 属性 查询匹配 "eggs" 或 "chicken" 的任何内容。

这是一个例子:

// 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 处理结果,让 .catch 处理错误,而不是对结果和错误都使用 .then

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

   })
   .catch(function(err) {

   });

而不是

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

   }, function(err) {

   });