Ravendb 尝试查询子对象结果 "cannot index not indexed field"

Ravendb trying to query child object results in "cannot index not indexed field"

我认为 class 会根据索引不言自明:

public class CalendarMatchIndex : AbstractIndexCreationTask<CalendarMatch>
    {

        public CalendarMatchIndex()
        {
            Map = matches => from match in matches
                select new
                {
                     match.CalendarId,
                     match.MatchDate,
                     match.CommunityId,
                     CategoryId = match.ImportData.CategoryId,
                     TeamTypeId = match.ImportData.TeamTypeId,
                     TeamSheetDeadline =match.ImportData.TeamSheetDeadline,
                     ActivityId =match.ImportData.ActivityId,

                };
        }
    }
}

查询:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);

结果在 'importdata.categoryid not indexed error'。我如何在不使用单独的结果 class 并且必须存储所有字段的情况下查询此字段?

编辑:添加 Json:

{
    "CalendarId": "7ui824avw496",

    "ImportData": {
        "ActivityType": "Tournament",
        "ActivityId": "aqhfl52xbff137",
        "LinkedMatchId": "bykdzj5j11kagf"
    },
    "CommunityId": null
}

查看您的索引定义,您将 ImportData.CategoryId 索引为 CategoryId 字段,这意味着您的查询应如下所示:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);

在我的查询中查看 x.ImportData.CategoryId -> x.CategoryId 更改。

创建一个结果class,其结构对应于索引结果:

public class CalendarMatchResult
{
    public string CalendarId { get; set; }
    public DateTime? MatchDate { get; set; }
    public string CommunityId { get; set; }
    public string CategoryId { get; set; }
    public string TeamTypeId { get; set; }
    public DateTime? TeamSheetDeadline { get; set; }
    public string ActivityId { get; set; }
}

然后,你可以这样查询索引:

var query = session.Query<CalendarMatchResult, CalendarMatchIndex>()
    .Where(x => x.CategoryId == input.CategoryId);

您不需要存储这些字段,除非您需要直接为索引检索它们。对于过滤,不存储的字段就可以了。

如果你不想在过去(ravendb 2.5)中创建一个结果class,我在地图上使用了这个语法:

Map = matches => from match in matches
                select new
                {
                     match.CalendarId,
                     match.MatchDate,
                     match.CommunityId,
                     ImportData_CategoryId = match.ImportData.CategoryId,
                     ImportData_TeamTypeId = match.ImportData.TeamTypeId,
                     ImportData_TeamSheetDeadline = match.ImportData.TeamSheetDeadline,
                     ImportData_ActivityId = match.ImportData.ActivityId,

                };

使用这张地图,您的查询应该有效:

var query = session.Query<CalendarMatch, CalendarMatchIndex>()
    .Where(x => x.ImportData.CategoryId == input.CategoryId);