【问题标题】:Query separate collection in RavenDB Index (WHERE IN)在 RavenDB 索引中查询单独的集合(WHERE IN)
【发布时间】:2020-02-06 14:04:52
【问题描述】:

使用 RavenDB v4.2 或更高版本,我想设置一个查询另一个集合的索引。基本上,在索引的映射部分重现 WHERE IN 子句。

以下模型代表两个系列。这里每个User 都有一组设备ID:

class Device {
    public string Id { get; set; }
    public string Name { get; set; }
}

class User {
    public string Id { get; set; }
    public string BlogPostId { get; set; }
    public List<string> DeviceIds { get; set; } 
}

现在考虑以下索引作为我要实现的目标的示例:

public class DeviceIndex : AbstractIndexCreationTask<Device, DeviceIndex.Result>
{
    public class Result
    {
        public string Id { get; set; }
        public string DeviceName { get; set; }
        public bool HasUser { get; set; }
        public int UserCount { get; set; }
    }
    public DeviceIndex()
    {
        Map = devices => from d in devices
                         select new Result
                         {
                             Id = d.Id,
                             DeviceName = d.Name,

                             HasUser = ... ?, // How to get this from Users collection?
                             UserCount = ... ? // same...

                         };

    }

如何在此索引中填充HasUser true/false 和UserCount 属性?例如。如何在这里查询“用户”集合?

请注意,为简洁起见,此示例已被严重简化。我对解决方法或更改其背后的逻辑不太感兴趣。

【问题讨论】:

    标签: c# indexing ravendb


    【解决方案1】:

    正如@Danielle 提到的,您需要使用 mutli-map-index 并减少结果。 这是一个工作示例

    public class DeviceIndex : AbstractMultiMapIndexCreationTask<DeviceIndex.Result>
        {
            public class Result
            {
                public string Id { get; set; }
                public string DeviceName { get; set; }
                public bool HasUser { get; set; }
                public int UserCount { get; set; }
            }
            public DeviceIndex()
            {
                AddMap<User>(users => from u in users
                                      from deviceId in u.DeviceIds
                                      let d = LoadDocument<Device>(deviceId)
                                    select new Result
                                    {
                                        Id = d.Id,
                                        HasUser = true,
                                        UserCount = 1,
                                        DeviceName = d.Name,
                                    });
                AddMap<Device>(devices => from d in devices
                                          select new Result
                                          {
                                              Id = d.Id,
                                              HasUser = false,
                                              UserCount = 0,
                                              DeviceName = d.Name,
                                          });
    
                Reduce = results => from result in results
                                    group result by new { result.Id } into g
                                    select new Result
                                    {
                                        Id = g.First().Id,
                                        DeviceName = g.First().DeviceName,
                                        HasUser = g.Any(e => e.HasUser),
                                        UserCount = g.Sum(e => e.UserCount),
                                    };
    
            }
        }
    

    你可以这样称呼它

    var result = await _session.Query<DeviceIndex.Result, DeviceIndex>().ToListAsync();
    

    【讨论】:

      【解决方案2】:

      如果您在 Device 类中有一个用户列表
      List&lt;string&gt; Users
      一个包含 Users 集合中文档 ID 的列表,然后您可以索引这些相关文档。

      见: https://demo.ravendb.net/demos/csharp/related-documents/index-related-documents

      或者反其道而行之,
      Users 集合上创建索引,并索引相关的 Device info


      在不改变当前模型的情况下,
      您可以创建一个多地图索引来索引来自不同集合的数据。

      https://ravendb.net/docs/article-page/4.2/csharp/indexes/multi-map-indexes

      https://ravendb.net/docs/article-page/4.2/csharp/studio/database/indexes/create-multi-map-index

      https://ravendb.net/learn/inside-ravendb-book/reader/4.0/10-static-indexes-and-other-advanced-options#querying-many-sources-at-once-with-multimap-indexes

      【讨论】:

      • 谢谢。感谢答案,但这正是我所说的“......对变通办法/或改变其背后的逻辑......”不感兴趣。我不想改造 - 但希望找到这个精确问题的答案。
      • 在这种情况下,您可以使用多地图索引 - 我会更新我的答案
      • 谢谢。但是在引用的文档中,我看到了更多的多态性示例,例如连接相同的属性。更像一个工会。除了文档链接之外,您能否使用我的示例提供一个简短的(伪/假)代码示例 - 我根本看不到它?
      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多