Как я могу использовать метод Find для выполнения поиска без учета регистра в поле базы данных?

Я не могу получить поиск без учета регистра в базе данных с помощью Sails.js V1.0 + Waterline ORM. Я использую адаптер sails-postgresql. Рабочая среда: Heroku + Heroku PostgreSQL.

Есть ли способ отключить следующий параметр в адаптере базы данных - Из соображений производительности чувствительность к регистру для содержит зависит от адаптера базы данных.

Пробовал метод:

Конфигурация хранилища данных:

default: {
  adapter: 'sails-postgresql',
  url: 'postgres://....',
  ssl: true,
  wlNext: {
    caseSensitive: true
  }
}

Кодовый блок:

var meetings = await Meeting.find({
  select: ['id', 'uid', 'name', 'deleted', 'complete'],
  where: {
    owner: user.id,
    name: { contains: searchJson.name } : ""
  },
  skip: (inputs.page > 0) ? (inputs.page) : 0,
  limit: (inputs.limit > 0) ? (inputs.limit) : 10,
  sort: 'date DESC'
});

person Binu Paul    schedule 02.04.2019    source источник


Ответы (3)


Самый простой способ справиться с этим и уникальными индексами без учета регистра с помощью PG / Sails - это использовать тип столбца citext вместо типа _1 _ / _ 2_ (по сравнению с переводом всего в нижний регистр, что неприятно).

citext - это текстовый тип данных без учета регистра. «По сути, он внутренне вызывает lower при сравнении значений. В остальном он ведет себя почти так же, как текст».

Пример атрибута модели, полученного из работающего приложения:

username: {
  type: 'string',
  columnType: 'citext',
  required: true,
  unique: true,
  description: 'A users.. Username',
  // ...
},

Согласно это (несколько несущественное) Heroku docs, похоже, он должен работать, но вам может потребоваться сначала запустить create extension citext; в своей базе данных.

person nahanil    schedule 11.04.2019
comment
Какой у нас вариант с Sails v1.2.4 и mongodb? - person Codetard; 13.08.2020

Для MongoDB https://github.com/balderdashy/sails/issues/7014. Из [email protected] вы можете связать .meta ({makeLikeModifierCaseInsensitive: true}) для запроса без учета регистра. Пример

await User.find(criteria).meta({makeLikeModifierCaseInsensitive: true});
person Marcell    schedule 26.09.2020

Вы можете использовать собственные запросы, например:

const eventTypesRows = await Meeting.getDatastore()
  .sendNativeQuery(\`SELECT "name" FROM meeting WHERE LOWER(name) = LOWER($1)\`, [searchName]);
person Artyom    schedule 06.04.2021