【问题标题】:Sequelize: Find All That Match Contains (Case Insensitive)Sequelize:查找所有匹配包含的内容(不区分大小写)
【发布时间】:2017-02-20 18:43:58
【问题描述】:

我想使用 sequelize.js 在模型中查询具有包含限制的记录。我该怎么做?

这就是我现在拥有的:

Assets
  .findAll({ limit: 10, where: ["asset_name like ?", '%' + request.body.query + '%'] })
  .then(function(assets){
    return response.json({
      msg: 'search results',
      assets: assets
    });
  })
  .catch(function(error){
    console.log(error);
  });

但我收到以下错误:

   { error: operator does not exist: character varying @> unknown
       at Connection.parseE (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:554:11)
       at Connection.parseMessage (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:381:17)
       at Socket.<anonymous> (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:117:22)
       at emitOne (events.js:96:13)
       at Socket.emit (events.js:188:7)
       at readableAddChunk (_stream_readable.js:176:18)
       at Socket.Readable.push (_stream_readable.js:134:10)
       at TCP.onread (net.js:548:20)
     name: 'error',
     length: 209,
     severity: 'ERROR',
     code: '42883',
     detail: undefined,
     hint: 'No operator matches the given name and argument type(s). You might need to add explicit type casts.',
     position: '246',
     internalPosition: undefined,
     internalQuery: undefined,
     where: undefined,
     schema: undefined,
     table: undefined,
     column: undefined,
     dataType: undefined,
     constraint: undefined,
     file: 'parse_oper.c',
     line: '722',
     routine: 'op_error',
     sql: 'SELECT "id", "asset_name", "asset_code", "asset_icon", "asset_background", "asset_add_view", "asset_add_script", "asset_add_id_regex", "date_created", "uniqueValue", "createdAt", "updatedAt" FROM "assets" AS "assets" WHERE "assets"."asset_name" @> \'%a%\' LIMIT 10;' },
  sql: 'SELECT "id", "asset_name", "asset_code", "asset_icon", "asset_background", "asset_add_view", "asset_add_script", "asset_add_id_regex", "date_created", "uniqueValue", "createdAt", "updatedAt" FROM "assets" AS "assets" WHERE "assets"."asset_name" @> \'%a%\' LIMIT 10;' }

如何在 sequelize 中使用包含查询?

【问题讨论】:

    标签: javascript sequelize.js


    【解决方案1】:
    Assets.findAll({
            limit: 10,
            where: {
                asset_name: {
                    [Op.like]: '%' + request.body.query + '%'
                }
            }
    }).then(function(assets){
        return response.json({
            msg: 'search results',
            assets: assets
        });
    }).catch(function(error){
        console.log(error);
    });
    

    编辑

    为了使其不区分大小写,您可以使用LOWER sql 函数,但之前您还必须将request.body.query 值小写。 Sequelize 查询将如下所示

    let lookupValue = request.body.query.toLowerCase();
    
    Assets.findAll({
        limit: 10,
        where: {
            asset_name: sequelize.where(sequelize.fn('LOWER', sequelize.col('asset_name')), 'LIKE', '%' + lookupValue + '%')
        }
    }).then(function(assets){
        return response.json({
            msg: 'message',
            assets: assets
        });
    }).catch(function(error){
        console.log(error);
    });
    

    它的作用是将表中的asset_name 值小写,并将request.body.query 值小写。在这种情况下,您将比较两个小写字符串。

    为了更好地了解在这种情况下发生了什么,我建议您查看有关sequelize.where()sequelize.fn()sequelize.col() 的sequelize 文档。当尝试执行一些不寻常的查询而不是简单的findAllfindOne 时,这些函数非常有用。

    在这种情况下,sequelize 当然是您的 Sequelize 实例。

    【讨论】:

    • 我已经更新了答案,现在应该不区分大小写了。
    • 如果你使用的是 PG,你可以使用 [Op.iLike]: `%${request.body.query}%` 并跳过小写字母。
    • 嗨@piotrbienias,当我想检查asset_name 是否与以下字符串之一匹配时我该怎么办:'bac'、'rgr'、'afg'、'rtt'。像这样: if (asset_name.match(/(bac)|(rgr)|(afg)|(rtt)/)) 获取它。
    【解决方案2】:

    如果您在 Postgres 中使用 sequlize,最好使用 [Op.iLike]: `%${request.body.query}%` ,您可以忘记 sequlize 函数。

    【讨论】:

    【解决方案3】:
    // search case insensitive nodejs usnig sequelize
    
    
     const sequelize = require('sequelize');
        let search = "Ajay PRAJAPATI"; // what ever you right here
        userModel.findAll({
            where: {
                firstname: sequelize.where(sequelize.fn('LOWER', sequelize.col('firstname')), 'LIKE', '%' + search.toLowerCase() + '%')
            }
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2012-02-18
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2023-03-07
      • 2017-06-26
      相关资源
      最近更新 更多