RavenDB 嵌套可变长度数组上的 Map/Reduce/Transform

2023-12-23

我是 RavenDB 的新手,到目前为止我很喜欢它。我还需要为我的项目创建一个索引。

问题

我有数千份调查回复(即“Submissions”),并且每个提交都有一系列特定问题的答案(即“Answers”),每个答案都有一系列已选择的选项(即“Values").

这是一个单一的Submission基本上看起来像:

{
  "SurveyId": 1,
  "LocationId": 1,
  "Answers": [
    {
      "QuestionId": 1,
      "Values": [2,8,32],
      "Comment": null
    },
    {
      "QuestionId": 2,
      "Values": [4],
      "Comment": "Lorem ipsum"
    },
    ...more answers...
  ]
}

更多问题:我必须能够按 SurveyId、LocationId、QuestionId、创建日期进行过滤。据我了解,这是在查询时完成的...我只需要确保这些属性存在于转换结果中(或者是归约结果?或两者兼而有之?)。如果我是对的,那么这就不是什么问题了。

所需的结果

每次调查的每个问题都需要一个对象来给出每个选项的总和。希望它是不言自明的:

[
    {
        SurveyId: 1,
        QuestionId: 1,
        NumResponses: 976,
        NumComments: 273,
        Values: {
            "1": 452, // option 1 selected 452 times
            "2": 392, // option 2 selected 392 times
            "4": 785  // option 4 selected 785 times
        }
    },
    {
        SurveyId: 1,
        QuestionId: 2,
        NumResponses: 921,
        NumComments: 46,
        Values: {
            "1": 325,
            "2": 843,
            "4": 119,
            "8": 346,
            "32": 524
        }
    },
    ...
]

我的尝试

我没有走得太远,我想这个帖子 https://stackoverflow.com/questions/15059122/how-to-properly-create-a-map-reduce-index-for-ravendb-in-c-sharp正在引导我走上正确的道路,但它对我的值列表没有帮助。我搜索了又搜索,但找不到任何关于如何处理这样的嵌套数组的方向。这是我到目前为止所拥有的:

MAP:

from submission in docs.Submissions
from answer in submission.Answers
where answer.WasSkipped != true && answer.Value != null
select new {
    SubmissionDate = submission["@metadata"]["Last-Modified"],
    SurveyId = submission.SurveyId,
    LocationId = submission.LocationId,
    QuestionId = answer.QuestionId,
    Value = answer.Value
}

REDUCE:

??

转换:

from result in results
from answer in result.Answers
where answer.WasSkipped != true && answer.Value != null
select new {
    SubmissionDate = result["@metadata"]["Last-Modified"],
    SurveyId = result.SurveyId,
    LocationId = result.LocationId,
    QuestionId = answer.QuestionId,
    Value = answer.Value
}

就其价值而言,它托管在 RavenHQ 上。

已经花了很长时间了,我一直在研究这个问题,但无法把它做好。非常感谢任何帮助我达到所需结果的帮助!


假设您的 C# 类如下所示:

public class Submission
{
    public int SurveyId { get; set; }
    public int LocationId { get; set; }
    public IList<Answer> Answers { get; set; }
}

public class Answer
{
    public int QuestionId { get; set; }
    public int[] Values { get; set; }
    public string Comment { get; set; }
}

如果您运行的是 RavenDB 2.5.2637 或更高版本,您现在可以使用字典结果类型:

public class Result
{
    public int SurveyId { get; set; }
    public int QuestionId { get; set; }
    public int NumResponses { get; set; }
    public int NumComments { get; set; }
    public Dictionary<int, int> Values { get; set; }
}

如果您运行的是早期版本(包括 2.0 版本),那么您将无法使用字典,但可以使用IList<KeyValuePair<int,int>>反而。

这是索引:

public class TestIndex : AbstractIndexCreationTask<Submission, Result>
{
    public TestIndex()
    {
        Map = submissions =>
              from submission in submissions
              from answer in submission.Answers
              select new
              {
                  submission.SurveyId,
                  answer.QuestionId,
                  NumResponses = 1,
                  NumComments = answer.Comment == null ? 0 : 1,
                  Values = answer.Values.ToDictionary(x => x, x => 1)
                  //Values = answer.Values.Select(x => new KeyValuePair<int, int>(x, 1))
              };

        Reduce = results =>
                 from result in results
                 group result by new { result.SurveyId, result.QuestionId }
                 into g
                 select new
                 {
                     g.Key.SurveyId,
                     g.Key.QuestionId,
                     NumResponses = g.Sum(x => x.NumResponses),
                     NumComments = g.Sum(x => x.NumComments),
                     Values = g.SelectMany(x => x.Values)
                               .GroupBy(x => x.Key)
                               .ToDictionary(x => x.Key, x => x.Sum(y => y.Value))
                               //.Select(x => new KeyValuePair<int, int>(x.Key, x.Sum(y => y.Value)))
                 };
    }
}

(不需要转换步骤。)

如果您无法使用 2.5.2637 或更高版本,请更换.ToDictionary其下方有注释行的行,并使用IList<KeyValuePair<int,int>>在结果类中。

允许在映射/缩减中使用字典的修复基于这个问题 http://issues.hibernatingrhinos.com/issue/RavenDB-1192你的帖子帮助确定了这一点。谢谢你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RavenDB 嵌套可变长度数组上的 Map/Reduce/Transform 的相关文章

随机推荐

  • android 如何调整媒体播放器表面视图中的视频宽度和高度

    想要在表面视图中调整视频大小 我正在使用 Surface 视图和视频支架在媒体播放器中播放视频 但在某些设备 如 Micromax iball Akash 平板电脑 上实现 MediaPlayerControl 时 它会给出 ACRA 错误
  • “ansible_ssh_common_args”变量可以用于清单文件中的不同子组吗?

    我正在尝试从 2 个不同的 ProxyJumpHost 连接到 2 个主机 例如 hostname1 只能通过 ProxyJumpHost1 访问 hostname2 只能通过 ProxyJumpHost2 访问 当我为该组单独提供 ans
  • 正则表达式错误地分割:用逗号但不在方括号内(两者都是 ) 和 ] )

    正则表达式的想法 用逗号分隔 后面不跟任何字符 and 或 此外 两个括号都应该被考虑 和 假设 字符串包含有效的括号 这是我的功能 function spl str var reg w s console log str split re
  • 我的 Admob 横幅显示在顶部

    我的应用程序中有一个 admob 横幅 并且我已经使用 AdMob 提供的文档实现了它 唯一的问题是它没有显示在屏幕底部 而是显示在顶部 现在我已经寻找了很长时间但我找不到如何更改它 也找不到网络上解决此问题的任何人 有人知道如何解决这个问
  • 使用 Gstreamer 提供 RTSP 流,寻求工作示例

    我们正在尝试让 Gstreamer 在 DM368 Leopardboard 上运行 我们已成功说服它创建测试视频 videotestsrc 对其进行编码并将其转储到文件中 有效的管道是 gst launch v videotestsrc
  • 使用 AutoFac 2 避免服务定位器

    我正在构建一个使用 AutoFac 2 进行 DI 的应用程序 我去过reading http code google com p autofac wiki BestPractices应避免使用静态 IoCHelper 服务定位器 IoCH
  • 什么样的下载代码违反了App Store审核指南?

    应用商店审查指南指出 以任何方式或形式下载代码的应用程序都将被拒绝 我想制作一个使用挑战响应进行身份验证的应用程序 该应用程序拥有 SHA 1 SHA 256 MD5 DES AES 等一组基本算法 挑战服务器制作包含随机排列的算法名称数组
  • PHP 一次提供一页服务

    我正在运行 Apache 2 和 PHP 5 2 配置 由于某种原因 PHP 一次只能提供一页服务 我有两个页面最能说明问题 test1 php 和 test2 php test1 php 中只有 sleep 120 test2 php 有
  • 2015 年的 signalr 3.0 beta 是否可用?

    想要将 Signalr 代码移植到 vnext 项目中 但我没有看到 SignalR 3 x 的参考 您需要在您的包中引用该包project json文件 像这样 dependencies Microsoft AspNet SignalR
  • 鼓励 JVM 进行 GC 而不是增加堆?

    请注意 当我说 JVM 时 我真正的意思是 热点 并且我正在运行最新的 Java 1 6 更新 示例情况 我的 JVM 正在运行 Xmx 设置为 1gb 目前 堆已分配 500mb 其中 450mb 已使用 该程序需要在堆上再加载 200
  • python中的正则表达式组重复

    string input ports 6012 6017 6016 m re match input ports s d 4 s d 4 s d 4 string print m groups gt 6012 6017 6016 但是当我想
  • elasticsearch聚合按聚合比率排序

    我在分析中有一个场景 我想计算表现最差的 20 个网点在 1000 多家门店中performance transactionCount VisitCount每月在折扣店 映射是 CustomerVisit properties outlet
  • 为什么 64 位机器上会出现内存碎片问题?

    在 32 位机器中 每个进程获得 4GB 的虚拟空间 在这种情况下 人们可能会担心我们可能会因为碎片化而遇到麻烦 但对于 64 位机器 理论上我们拥有巨大的可寻址虚拟内存 那么为什么内存碎片在 64 位机器中仍然是一个问题 如果有的话 您尝
  • HTML5 模板无法在 Internet Explorer 上运行,如何解决?

    我用 HTML5 制作了一个模板 它适用于 Chrome 和 Firefox 但不适用于 Internet Explorer 在 IE 8 上测试 我怎么解决这个问题 只需将 display none 添加到您的模板中即可 适用于 11
  • asyncio 的默认调度程序什么时候公平?

    我的理解是asyncio gather旨在运行其参数同时此外 当协程执行等待表达式时 它为事件循环提供了安排其他任务的机会 考虑到这一点 我惊讶地发现以下代码片段忽略了其中一个输入asyncio gather import asyncio
  • 通过 WSDL/SoapServer 解析 SOAP 响应

    我需要接受包含一些数据的不可修改的 SOAP 消息 它被发布到我的 WSDL 文件 然后是 PHP SoapServer 如何通过 wsdl 或 php 提取消息中的特定数据 封装在 xml 键中 Data flow actions are
  • 将值数组从 Android Activity 传递到 WebView 中的 JavaScript

    我正在使用 JS Charts 库在 Android 应用程序的 WebView 中绘制图表 我想提供 SQLite 数据库中的数据 此时此刻 我陷入了如何将数据数组从 Java 传递到 JavaScript 的困境 JavaScript
  • 在 jTable 中移动一行

    如何将一排移入jTable以便row1去row2的位置和row2去row1的立场 Use the moveRow 的方法DefaultTableModel 或者 如果您不使用 DefaultTableModel 则在自定义模型中实现类似的方
  • 禁用 VSCode 提示:“您要保存工作区配置吗”?

    使用最新发布的 VSCode 版本 在撰写本文时 2018 年 1 月 29 日 版本 1 19 3 我看到以下行为 根据我的需要 这不必要地耗时 每当我尝试关闭从多个不同目录打开文件的窗口时 我都会收到以下提示 您想将工作区配置保存为文件
  • RavenDB 嵌套可变长度数组上的 Map/Reduce/Transform

    我是 RavenDB 的新手 到目前为止我很喜欢它 我还需要为我的项目创建一个索引 问题 我有数千份调查回复 即 Submissions 并且每个提交都有一系列特定问题的答案 即 Answers 每个答案都有一系列已选择的选项 即 Valu