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

#sails.js #waterline #heroku-postgres #sails-postgresql

#sails.js #ватерлиния #heroku-postgres #sails-postgresql

Вопрос:

Я не могу получить поиск без учета регистра из базы данных с помощью Sails.js Версия V1.0 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'
});
  

Ответ №1:

Самый простой способ, который я нашел для обработки этого и не зависящих от регистра уникальных индексов с помощью PG / Sails, — это использовать тип столбца citext вместо text / character varying types (по сравнению с принудительным вводом всего в нижний регистр, который воняет).

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

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

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

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

Комментарии:

1. Какой вариант у нас есть с Sails версии v1.2.4 и mongodb?

2. Столкнулся с аналогичной проблемой, но также у materialized views были зависимости от таблицы, в которой я хотел изменить тип столбца. В этом случае вам нужно удалить материализованные представления, затем обновить столбец таблицы с помощью приведенной ниже команды: «ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца TYPE citext;» и после этого воссоздать материализованные представления, которые были удалены ранее.

Ответ №2:

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

 await User.find(criteria).meta({makeLikeModifierCaseInsensitive: true});
  

Ответ №3:

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

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