Вот моя ситуация:
В моей базе данных 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, применить аргумент без учета регистра к операции «Содержит»?
Обновлено: Вот как мой объект разрешается внутри 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();
}
}





Попробуйте применить флаг i, чтобы сделать регулярное выражение нечувствительным к регистру.
См.: https://stackoverflow.com/a/10610461/5024706
Я пробовал, но операция выглядит так: js filters: { name: { contains: "name" } } И, судя по всему, добавление i не работает
Где вы добавили флаг? :)
в части «имя», но после некоторых тестов кажется, что это конфликт между обработкой фильтрации HotChocolate и MongoDb.Driver, поскольку я нашел альтернативу, которая работает, AKA Создание моего собственного фильтра (все еще использующего фильтры HotChocolate), но преобразуя это в фильтр MongoDB.Driver
Во-первых, вам следует использовать GraphQL
variablesв своем запросе вместо подстановки строк. Кроме того, поделитесь преобразователем с запросом MongoDB, потому что именно здесь будет играть роль чувствительность к регистру. Короткий ответ: да: запросы MongoDB могут быть нечувствительны к регистру. Помните: GraphQL — это не база данных, база данных на самом деле должна выполнить запрос, который ей отправил GraphQL.