【问题标题】:js sequelize multiple where in include not workingjs 续集多个 where in include 不起作用
【发布时间】:2017-04-28 23:44:39
【问题描述】:

我有一个包含模型中有多个 where 条件的 sequelize 查询:

const scrapingUrl = await db.ScrapingUrl.findOne({
            where: strong text{
                date_downloaded: null,
            },
            include: [ {
                model: db.Action,
                where: {
                    $or: {
                        hourly_scraping_limit: null,
                        scraping_counter: {
                            $or: {
                                $eq: null,
                                $lt: Sequelize.literal('Action.hourly_scraping_limit')
                            }
                        }
                    },
                    $or: {
                        hourly_scraping_limit_per_proxy: null,
                        scraping_counter_per_proxy: {
                            $or: {
                                $eq: null,
                                $lt: Sequelize.literal('Action.hourly_scraping_limit_per_proxy')
                            }
                        }
                    }
                },
                include: [ db.ScrapingContainer ]
            } ]
        });

它似乎忽略了 hourly_scraping_limit 部分,只过滤了 hourly_scraping_limit_per_proxy。相关的查询部分是这样的:

$or: {
    hourly_scraping_limit: null,
    scraping_counter: {
        $or: {
            $eq: null,
            $lt: Sequelize.literal('Action.hourly_scraping_limit')
        }
    }
},

Sequelize 记录以下 SQL 语句:

SELECT `ScrapingUrl`.`id`, `ScrapingUrl`.`action_id`, `ScrapingUrl`.`url`, `ScrapingUrl`.`date_added`, `ScrapingUrl`.`date_downloaded`, `ScrapingUrl`.`date_scraped`, `ScrapingUrl`.`success_pattern_found`, `ScrapingUrl`.`blocked_pattern_found`, `ScrapingUrl`.`scraping_blob_id`, `Action`.`id` AS `Action.id`, `Action`.`name` AS `Action.name`, `Action`.`scraping_container_id` AS `Action.scraping_container_id`, `Action`.`hourly_scraping_limit` AS `Action.hourly_scraping_limit`, `Action`.`hourly_scraping_limit_per_proxy` AS `Action.hourly_scraping_limit_per_proxy`, `Action`.`scraping_counter` AS `Action.scraping_counter`, `Action`.`scraping_counter_per_proxy` AS `Action.scraping_counter_per_proxy`, `Action`.`scraping_counter_last_reset` AS `Action.scraping_counter_last_reset`, `Action`.`scraping_success_pattern` AS `Action.scraping_success_pattern`, `Action`.`scraping_blocked_pattern` AS `Action.scraping_blocked_pattern`, `Action.ScrapingContainer`.`id` AS `Action.ScrapingContainer.id`, `Action.ScrapingContainer`.`name` AS `Action.ScrapingContainer.name` FROM `scraping_urls` AS `ScrapingUrl` INNER JOIN `actions` AS `Action` ON `ScrapingUrl`.`action_id` = `Action`.`id` AND ((`Action`.`hourly_scraping_limit_per_proxy` IS NULL OR (`Action`.`scraping_counter_per_proxy` IS NULL OR `Action`.`scraping_counter_per_proxy` < Action.hourly_scraping_limit_per_proxy))) LEFT OUTER JOIN `scraping_containers` AS `Action.ScrapingContainer` ON `Action`.`scraping_container_id` = `Action.ScrapingContainer`.`id` WHERE `ScrapingUrl`.`date_downloaded` IS NULL LIMIT 1;

【问题讨论】:

    标签: javascript sequelize.js


    【解决方案1】:

    $or 格式不正确。我认为这就是问题所在。示例:

    where: {
      '$or': [
        {bla: true},
        {bla: false}
      ]
    }
    

    翻译为:

    WHERE bla = true OR bla = false
    

    如果需要嵌套$or:

    where: {
      '$or': [
        {'$or': [{foo: true, bar: false}, {foo: false, bar: true}]},
        {'$or': [{bla: true, ble: false}, {bla: false, ble: true}]},
      ]
    }
    

    翻译为:

    WHERE ((foo = true AND bar = false) OR (foo = false AND bar = true)) OR ((foo = false AND bar = true) OR (foo = true AND bar = false))
    

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多