MongoDB нечувствителен к регистру, содержит операцию, возможно ли это?

Вот моя ситуация:

В моей базе данных MongoDB есть список объектов. Используя API GraphQL, я могу искать их с помощью фильтра. Этот фильтр создает входной фильтр «содержит» с моим значением, например «бар». Однако, когда запрос завершен, я получаю только объект, который точно соответствует последовательностям «бар», даже если у меня есть другие варианты последовательности «бар» (Бар, БАР и так далее...).

Я пробовал много реализаций в своем проекте C# (Пользовательская фильтрация, Пользовательское соглашение,...), но, похоже, ничего не работает.

вот пример запроса:

query SEARCH{
  search (            
    id: {
      wksUuid:"id1",
      prjUuid:"id2",
      fileUuid:"id3",
      fileVersion:"id4",
      stepLine:"id5"
    }        
  ) 
  {             
    foo
    (
      first: 30 
      after: null, 
      order: null, 
      where: {
        name:{
          contains: "bar"
        }
      }
    ) {                 
      pageInfo {                     
        hasNextPage                     
        endCursor                 
      }                 
      nodes {                                         
        name                               
      }             
    }         
  }     
}

Этот запрос рассматривается как таковой в моем пакете:

public async getFooItems(id: id, first?: string, cursor?: string, order?: any[], filters?: any): Promise<ResponseAPICall<any>> {
    const stringifiedId: string = JSON.stringify(id)?.replace(/"([^"]+)":/g, '$1:')
    
    const query: string = this.SEARCH.replace('$id', stringifiedId)
                                .replace('$cursor', cursor ? `"${cursor}"` : 'null')
                                .replace('$first', first ? first : 'null')
                                .replace('$order', (order && order?.length > 0) ? JSON.stringify(order)?.replace(/['"]+/g, '') : 'null')
                                .replace('$filters', filters ? JSON.stringify(filters)?.replace(/\"(\w+)\"\:/g, "$1:")?.replace(/\"([^\"]+)\":/g, '$1:') : 'null')
    const body: {query: string} = { query: query }
    const response: ResponseAPICall<any> = await this.httpRqs.post(this.apiUrl, body)

    return response
}

Возможно ли вообще, используя HotChocolate, MongoDB.Driver, применить аргумент без учета регистра к операции «Содержит»?

  • Пользовательский строковый фильтр (C#): реализация пользовательского фильтра для переопределения операции содержания не работала.
  • Custom FilterConvention: Custom FilterConvention для переопределения текущего соглашения, неудачно.
  • Следовал Расширение фильтрации, не сработало (операция содержания не была переопределена по моему запросу)
  • Попытка отредактировать фильтр перед отправкой запроса не удалась (невозможно преобразовать StringType в RegexType).

Обновлено: Вот как мой объект разрешается внутри GraphQL, и я пытался расширить указанный преобразователь, чтобы попытаться настроить операции, но безуспешно.

public class Foo: ObjectType<Foo>
{
    protected override void Configure(IObjectTypeDescriptor<Foo> descriptor)
    {
        descriptor.Field(_ => _.Id);
        descriptor.Field(_ => _.History);

        descriptor.Field(_ => _.Name);
        descriptor.Field(_ => _.IfcClassName);
        descriptor.Field(_ => _.IniesClassifCode);
        descriptor.Field(_ => _.Contributor);
        descriptor.Field(_ => _.Unit);
        descriptor.Field(_ => _.Lot);
        descriptor.Field(_ => _.BundleId);
        descriptor.Field(_ => _.RelatedContributorsId);
        descriptor.Field(_ => _.Qto);
        descriptor.Field(_ => _.RelatedEmptyComponentId);
        descriptor.Field(_ => _.InodeId);

        descriptor.Field<CbzContributorResolver>(_ => _.GetRelatedContributors(default, default))
            .Name("relatedContributors")
            .UsePaging()
            //.UseOffsetPaging()
            .UseSorting()
            .UseFiltering();
    }
}

Во-первых, вам следует использовать GraphQL variables в своем запросе вместо подстановки строк. Кроме того, поделитесь преобразователем с запросом MongoDB, потому что именно здесь будет играть роль чувствительность к регистру. Короткий ответ: да: запросы MongoDB могут быть нечувствительны к регистру. Помните: GraphQL — это не база данных, база данных на самом деле должна выполнить запрос, который ей отправил GraphQL.

Michel Floyd 06.03.2024 19:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте применить флаг i, чтобы сделать регулярное выражение нечувствительным к регистру.

См.: https://stackoverflow.com/a/10610461/5024706

Я пробовал, но операция выглядит так: js filters: { name: { contains: "name" } } И, судя по всему, добавление i не работает

Nylak 15.03.2024 15:28

Где вы добавили флаг? :)

baterja 17.03.2024 12:44

в части «имя», но после некоторых тестов кажется, что это конфликт между обработкой фильтрации HotChocolate и MongoDb.Driver, поскольку я нашел альтернативу, которая работает, AKA Создание моего собственного фильтра (все еще использующего фильтры HotChocolate), но преобразуя это в фильтр MongoDB.Driver

Nylak 02.04.2024 16:26

Другие вопросы по теме