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