Indexing Ravendb4.2地图缩减字典

Indexing Ravendb4.2地图缩减字典,indexing,mapreduce,ravendb,Indexing,Mapreduce,Ravendb,我有一个聊天信息的集合,其中有一个guid列表,它是看到此消息的成员 为了能够检查每个聊天的未读消息数,我通过检查有多少消息和用户看到多少消息来汇总这些结果 最初我提出了这个索引: public class ChatMessages_BySeen : AbstractIndexCreationTask<ChatMessage, ChatMessages_BySeen.Result> { public override string IndexName => nameof

我有一个聊天信息的集合,其中有一个guid列表,它是看到此消息的成员

为了能够检查每个聊天的未读消息数,我通过检查有多少消息和用户看到多少消息来汇总这些结果

最初我提出了这个索引:

public class ChatMessages_BySeen : AbstractIndexCreationTask<ChatMessage, ChatMessages_BySeen.Result>
{
    public override string IndexName => nameof(ChatMessages_BySeen);

    public class Result
    {
        public string GroupId { get; set; } = null!;
        public IEnumerable<Guid> SeenBy { get; set; } = null!;
        public int Total { get; set; }
    }

    public ChatMessages_BySeen()
    {
        Map = messages => 
                            from message in messages
                            select new
                            {
                                GroupId = message.GroupId,
                                SeenBy = message.SeenBy.Select(x => x),
                                Total = 1
                            };

        Reduce = results =>
                            from result in results
                            group result by result.GroupId into g
                            select new
                            {
                                GroupId = g.Key,
                                SeenBy = g.SelectMany(x => x.SeenBy.Select(p => p)),
                                Total = g.Sum(x => x.Total)
                            };
    }
}
公共类聊天信息\u BySeen:AbstractIndexCreationTask
{
公共重写字符串IndexName=>nameof(ChatMessages\u BySeen);
公开课成绩
{
公共字符串GroupId{get;set;}=null!;
公共IEnumerable SeenBy{get;set;}=null!;
公共整数总计{get;set;}
}
公共聊天信息
{
Map=消息=>
从消息中的消息
选择新的
{
GroupId=message.GroupId,
SeenBy=message.SeenBy.Select(x=>x),
总计=1
};
减少=结果=>
从结果到结果
按result.GroupId将结果分组为g
选择新的
{
GroupId=g.Key,
SeenBy=g.SelectMany(x=>x.SeenBy.Select(p=>p)),
总计=g.Sum(x=>x.Total)
};
}
}
但这会快速生成大量重复的用户ID。因此,我想,从中得到一些启发,我可以将每个成员的计数相加->

    public class ChatMessages_BySeen : AbstractIndexCreationTask<ChatMessage, ChatMessages_BySeen.Result>
{
    public override string IndexName => nameof(ChatMessages_BySeen);

    public class Result
    {
        public string GroupId { get; set; } = null!;
        public Dictionary<Guid, int> SeenCounter { get; set; } = null!;
        public int Total { get; set; }
    }

    public ChatMessages_BySeen()
    {
        Map = messages => 
                            from message in messages
                            select new
                            {
                                GroupId = message.GroupId,
                                SeenBy = message.SeenBy.ToDictionary(x => x, x => 1),
                                Total = 1
                            };

        Reduce = results =>
                            from result in results
                            group result by result.GroupId into g
                            select new
                            {
                                GroupId = g.Key,
                                SeenBy = g.SelectMany(x => x.SeenCounter).GroupBy(x => x.Key).OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Sum(y => y.Value)),
                                Total = g.Sum(x => x.Total)
                            };
    }
}
公共类聊天信息\u BySeen:AbstractIndexCreationTask
{
公共重写字符串IndexName=>nameof(ChatMessages\u BySeen);
公开课成绩
{
公共字符串GroupId{get;set;}=null!;
公共字典SeenCounter{get;set;}=null!;
公共整数总计{get;set;}
}
公共聊天信息
{
Map=消息=>
从消息中的消息
选择新的
{
GroupId=message.GroupId,
SeenBy=message.SeenBy.ToDictionary(x=>x,x=>1),
总计=1
};
减少=结果=>
从结果到结果
按result.GroupId将结果分组为g
选择新的
{
GroupId=g.Key,
SeenBy=g.SelectMany(x=>x.SeenCounter)、GroupBy(x=>x.Key)、OrderBy(x=>x.Key)、ToDictionary(x=>x.Key,x=>x.Sum(y=>y.Value)),
总计=g.Sum(x=>x.Total)
};
}
}

但是,这始终将SeenCounter设置为空/空。有人能帮我找到正确的方向吗?

如果SeenBy有重复的邮件,为什么不在其上使用distinct?因为我需要按count not distinct进行分组,以便将邮件总数与每个用户看到的数量进行比较,以获得未看到的邮件数。希望我有道理:-p