【问题标题】:How to find results in an array in a Sequelize model如何在 Sequelize 模型中的数组中查找结果
【发布时间】:2021-09-15 04:44:14
【问题描述】:

我有一个模型:

const MenuItem = sequelize.define('MenuItem', {
        ...
        tags: {
            type: DataTypes.JSON,
            allowNull: false
        }
    }, {});
    return MenuItem;
};

我想构建一个 findAll 来搜索标签以查找一个或多个可能的匹配项。例如,如果标签列有一个值:

["a", "b", "c"]

那么我希望能够通过任何一个

`["a"]`

`["a", "c"]` 

到我的服务器并搜索可能的匹配项。我尝试过使用 Op.contains 和 Op.in 但都导致错误。我在这里走错路了吗?我将如何在 sequelize 中构建此查询?

【问题讨论】:

    标签: javascript mysql arrays json sequelize.js


    【解决方案1】:

    所以我想出了一些办法。我认为它有点hacky,但它完成了工作。如果其他人能提出更好的解决方案,我将不胜感激。

    在我的控制器中,首先我检查是否已将标签传递给它(将是一个字符串,因为 GET 请求没有正文,因此是拆分),如果是:

                const tagArr = tags.split("|")
                if (tagArr.length > 1) {
                    params.tags = { [Op.and]: tagArr.map(e => {
                        return { [Op.like]: [`%${e}%`]}
                    })}
                } else {
                    params.tags = { [Op.like]: [`%${tagArr[0]}%`]}
                }
    

    我不是 100% 确定为什么 op.like 的值也必须在一个数组中。起初我认为这意味着我可以只传递 1 个或多个值,但如果我匹配其中任何一个值,它就会返回(后来由于某种原因它停止工作。不确定我在那里改变了什么)但我希望它们匹配所有存在的标签。因此,在 Op.and 中,我将 tagArr 映射到一系列 Op.likes 中。如果 tagArr 中只有一个元素,那么我只需跳过 op.and

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 2018-12-04
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多