使用IQueryable / AutoMapper将查询推到最前面,以使Mongo使用索引

时间:2019-03-12 14:02:37

标签: mongodb asp.net-web-api automapper iqueryable

我想通过WebApi公开IQueryable<TPublic>,API使用者可以通过任意查询来查询。存储的对象的类型为TInternal,因此我正在使用AutoMapper's Queryable Extensions来映射IQueryable<TInternal> -> IQueryable<TPublic>。这行得通,我可以使用Odata's 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>();
}

关于如何使之成为可能的任何建议,而无需我编写过滤器的完整反向映射?

0 个答案:

没有答案