Нажмите на запрос вперед с помощью IQueryable / AutoMapper, чтобы заставить Mongo использовать индекс - PullRequest
0 голосов
/ 12 марта 2019

Я хочу выставить IQueryable<TPublic> через WebApi, который может запрашиваться произвольным запросом потребителем API. Сохраненные объекты имеют тип TInternal, поэтому я использую Queryable Extensions AutoMapper для отображения IQueryable<TInternal> -> IQueryable<TPublic>. Это работает, и я могу использовать Одата EnableQuery для фильтрации / разбивки на страницы и тому подобное.

Однако MongoDB будет использовать индекс только тогда, когда проекция выполняется после совпадения при запросах с использованием структуры агрегации. Из-за моей настройки это всегда так, и индекс никогда не будет использоваться (пока Mongo не реализует билет, связанный с Jira).

Для фактического использования индексов, вероятно, от меня требуется перенести совпадение до проекции. Однако фильтры определяются для полей, доступных через TPublic, а не для TInternal. Это не тривиально, поскольку проекция может быть более сложной, чем просто переименование некоторых полей и скрытие других полей.

Пример запроса, который не использует индекс:

db.User.aggregate([
    $project: { UserName: "uname", Email: "email" },
    $match: { UserName: "Bouke" }
])

Пример запроса, который использует индекс:

db.User.aggregate([
    $match: { uname: "Bouke" },
    $project: { UserName: "uname", Email: "email" }
])

Пример действия:

[EnableQuery(...)]
public IQueryable<User>()
{
    return UserCollection.AsQueryable().ProjectTo<User>();
}

Любые предложения о том, как сделать это возможным, не требуя от меня полного обратного сопоставления фильтров?

...