NodeJS 如何搜索多个列?

ecfdbz9o  于 2023-01-04  发布在  Node.js
关注(0)|答案(5)|浏览(118)

我有一个数据库的文章与几列,并希望能够搜索titledescription
目前,我有:

Article.findAll({
  where: {
    title: { like: '%' + searchQuery + '%' }
  }
});

我如何同时搜索描述?
我已经通读了sequelize文档,甚至在Complex filtering / OR / NOT queries部分,但示例似乎只在一个专栏中解释了搜索。

sq1bmfud

sq1bmfud1#

序列化〉= 4.12

const Op = Sequelize.Op;
Article.findAll({
  where: {
    title: { [Op.like]: '%' + searchQuery + '%' },
    description: { [Op.like]: '%' + searchQuery2 + '%' }
  }
});

续接〈4.12

Article.findAll({
  where: {
    title: { like: '%' + searchQuery + '%' },
    description: { like: '%' + searchQuery2 + '%' }
  }
});

以上操作将确保title包含searchQuerydescription包含searchQuery2。但是,如果您希望在文章包含这两个中的一个时返回结果,则应执行以下查询:

序列化〉= 4.12

const Op = Sequelize.Op;
Article.findAll({
  where: {
    [Op.or]: [
     title: { [Op.like]: '%' + searchQuery + '%' },
     description: { [Op.like]: '%' + searchQuery2 + '%' }
    ]
  }
});

续接〈4.12

Article.findAll({
  where: {
    $or: [
     title: { like: '%' + searchQuery + '%' },
     description: { like: '%' + searchQuery2 + '%' }
    ]
  }
});
ruarlubt

ruarlubt2#

续码〉= 4.12

Article.findAll({
 where = {
  [Op.or]: [
    { name: { [Op.like]: `%${req.query.query_string}%` } },
    { description: { [Op.like]: `%${req.query.query_string}%` } }
  ]
}
});

仅供参考:mysql不支持iLike ;)

xfb7svmp

xfb7svmp3#

你的问题是我第一次听说sequelize.js,但我看了看文档,发现这:

Project.findOne({
  where: {
    name: 'a project',
    $or: [
      { id: [1,2,3] },
      { id: { $gt: 10 } }
    ]
  }
})

Project.findOne({
  where: {
    name: 'a project',
    id: {
      $or: [
        [1,2,3],
        { $gt: 10 }
      ]
    }
  }
})

这两段代码将生成以下内容:

SELECT *
FROM `Projects`
WHERE (
  `Projects`.`name` = 'a project'
   AND (`Projects`.`id` IN (1,2,3) OR `Projects`.`id` > 10)
)
LIMIT 1;

这些示例上面的部分给出了允许的各种子句,包括$and$or

Project.findAll({
  where: {
    id: {
      $and: {a: 5}           // AND (a = 5)
      $or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
  ... etc
rfbsl7qr

rfbsl7qr4#

您应该使用以下命令:

where: {
  [op.or]: [
    {
      model: {
        [op.like]: `%${ req.query.search }%`
      }
    },
    {
      description: {
        [op.like]: `%${ req.query.search }%`
      }
    }
  ]
}
hwamh0ep

hwamh0ep5#

如果你想在Model Sequelize中搜索所有列,这里有一个例子,你可以将每个列转换为varchar,这样就可以使用ilike操作符,并将它们推入数组中,这将是where子句,我的意思是,在这个例子中,repo是sequelize模型。

async findFilterAndCountAll(pg: { limit : number, offset : number, sort:string, order: string, pfilter : any}) {
        var filters = Array();
        for (const key in this.repo.rawAttributes ) {
            console.log(key);
            filters.push(sequelize.where(
                sequelize.cast(sequelize.col(key), 'varchar'),
                {[Op.iLike]: `%tes%`}
              ))
        }
        return await this.repo.findAndCountAll({
            limit : pg.limit,
            offset : pg.offset,
            order: [
                [pg.order, pg.sort]
            ],
            where : {
                [Op.or]: filters
            }
        }); 
    }

相关问题