如何在RavenDB中使用嵌套索引

时间:2015-08-18 13:07:06

标签: lucene ravendb

我有一个聊天对象,参与者作为列表。我需要加强参与者的兴趣。包含更多元数据的记录(例如,全名,公司名称,而不仅仅是用户ID)。

更新:
ChatLastMessage_Index :仅通过传递ExternalChatId或participantId来查询(因此查找特定聊天或特定参与者的所有聊天)

Profile_Index :查询通过某个人的姓名

这里的目标是装饰聊天的参与者。元数据。
目前,用于检索聊天的索引及其最后一条消息是:

public class ChatLastMessage_Index : AbstractIndexCreationTask<ChatMessage, ChatLastMessage_Index.Result>
{
    public class Result
    {
        public string Id { get; set; }
        public string ExternalChatId { get; set; }
        public List<Participant> Participants { get; set; }

        // last message's information:
        public string LastMessageUuid { get; set; }
    }

    public ChatLastMessage_Index()
    {
        Map = messages => from message in messages
                          let chat = LoadDocument<Chat>(message.ChatId)
                          select new Result
                          {
                              Id = chat.Id,
                              ExternalChatId = chat.ExternalChatId,
                              Participants = chat.Participants,
                              LastMessageUuid = message.Id,
                              LastMessageCreatedBy = message.CreatedBy
                          };

        Reduce = results => from result in results
                            group result by result.ExternalChatId into g
                            select new Result
                            {
                                Id = g.First().Id,
                                ExternalChatId = g.First().ExternalChatId,
                                Participants = g.First().Participants,
                                LastMessageUuid = g.OrderByDescending(m => m.LastMessageCreatedAt).First().LastMessageUuid
                            };
    }
}

由于我们有另一个索引(Profile_Index)来检索所需的所有参与者元数据,我想知道是否可以在ChatLastMessage_Index中重复使用其结果,以避免复制/粘贴其逻辑。
在用于检索参与者元数据的第二个索引下面:

public class Profile_Index : AbstractMultiMapIndexCreationTask<PersonProfile_Index.ReducedResult>
{
    public class ReducedResult
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string JobTitle { get; set; }
        public string ProfileImageUrl { get; set; }
        public string OrganizationId { get; set; }
        public string OrganizationName { get; set; }
        public string OrgCountryName { get; set; }
        public List<LanguageProficiency> Languages { get; set; }
    }

    public PersonProfile_Index()
    {
        AddMap<Person>(
            persons => from person in persons
                       select new ReducedResult
                       {
                           Id = person.Id,
                           Name = person.Name,
                           Languages = person.Languages,
                           ProfileImageUrl = person.ProfileImage.Url
                           JobTitle = null,
                           OrganizationId = null,
                           OrganizationName = null,
                           OrgCountryName = null
                       });

        AddMap<Employment>(
           employments => from empl in employments
                          let org = LoadDocument<Organization>(empl.OrganizationId)
                          let countryName = LoadDocument<Country>(org.CountryOfResidenceId).Name
                          select new ReducedResult
                          {
                              Id = empl.PersonId,
                              Name = null,
                              Languages = null, 
                              ProfileImageUrl = null,
                              JobTitle = empl.JobTitle,
                              OrganizationId = org.Id,
                              OrganizationName = org.Name,
                              OrgCountryName = countryName
                          });

        Reduce = results => from result in results
                            group result by result.Id into g
                            select new ReducedResult
                                   {
                                       Id = g.Key,
                                       Name = g.Select(x => x.Name).FirstOrDefault(p => p != null),
                                       JobTitle = g.Select(x => x.JobTitle).FirstOrDefault(p => p != null),
                                       Languages = g.Select(x => x.Languages).FirstOrDefault(p => p != null),
                                       ProfileImageUrl = g.Select(x => x.ProfileImageUrl).FirstOrDefault(p => p != null),
                                       OrganizationId = g.Select(x => x.OrganizationId).FirstOrDefault(p => p != null),
                                       OrganizationName = g.Select(x => x.OrganizationName).FirstOrDefault(p => p != null),
                                       OrgCountryName = g.Select(x => x.OrgCountryName).FirstOrDefault(p => p != null)
                                   };

    }
}

0 个答案:

没有答案