【问题标题】:Sequelize query multiple timesSequelize 查询多次
【发布时间】:2017-03-19 14:34:06
【问题描述】:

我正在尝试改进我网站上的搜索,这就是它目前的样子(我使用 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();
    });

我认为这是不言自明的,但如果有不清楚的地方,请在 cmets 上问我。

现在,此搜索算法考虑了 WHOLE 参数,因此搜索“chicken eggs”将不会返回任何内容,因为在我的数据库中它们被保存为“eggs”。

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

var keywords = queryName.split(' ');

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

我检查了这里的文档和一些问题,但找不到任何东西,感谢任何帮助,非常感谢。

【问题讨论】:

    标签: node.js database search sequelize.js querying


    【解决方案1】:

    您可以使用$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) {
    
       });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2016-12-15
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多