代码之家  ›  专栏  ›  技术社区  ›  Zack Shapiro

如何在jsonb列中按键查询数组?

  •  0
  • Zack Shapiro  · 技术社区  · 7 年前

    我有一个 user 有一张桌子 data jsonb列。在这方面,我有一个 cars

    我正试图做一个这样的查询,以确定用户的 汽车 数组包含Toyota或Mitsubishi,但它抛出了一个错误

    await knex('users.record')
        .where('created_at', '>', '2019-05-21')
        .select('data')
        .whereRaw('cars', ['Toyota', 'Mitsubishi']) // this seems wrong
        .returning('*');
    

    一个示例用户的 汽车 ['Toyota', 'Mitsubishi', 'Honda', 'Ford']

    0 回复  |  直到 7 年前
        1
  •  0
  •   Erwin Brandstetter    7 年前

    你可以使用 jsonb contains operator @>

    SELECT * FROM users
    WHERE  created_at > '2019-05-21'
    AND   (data @> '{"cars":["Toyota"]}' OR
           data @> '{"cars":["Mitsubishi"]}');
    

    纯SQL,我不熟悉knex。

        2
  •  0
  •   chatnoir    7 年前

    试着替换

    .whereRaw('cars', ['Toyota', 'Mitsubishi'] 
    

    具有

    where('cars', 'like','%Toyota%').orWhere('cars', ,like, '%Mitsubishi%')
    
        3
  •  0
  •   Rich Churcher    7 年前

    我认为在Knex中会出现类似的情况(带有一个小的帮助函数以减少重复):

    const hasCar = brand => knex.raw(
      `?? @> ?::jsonb`,
      [
        'data',
        JSON.stringify({ cars: [ brand ]})
      ]
    )
    
    knex('users.record')
      .where(hasCar('Mitsubishi'))
      .orWhere(hasCar('Toyota'))