Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB中的报告:查询中参数的单独组合 我们想做什么_C#_.net_Mongodb_Indexing_Reporting - Fatal编程技术网

C# MongoDB中的报告:查询中参数的单独组合 我们想做什么

C# MongoDB中的报告:查询中参数的单独组合 我们想做什么,c#,.net,mongodb,indexing,reporting,C#,.net,Mongodb,Indexing,Reporting,在我们的应用程序中,客户可以创建自己的报告(CSV、Excel、PDF)。在应用程序中,它们可以组合多达30个字段进行过滤,以及多达20个字段进行单独排序(asc&desc)。将立即显示预览 历史与未来 我们开发和运行该应用程序已有几年了。在过去,我们使用NoSql Ravendb3.5,很容易将所有数据放入索引中。查询字段没有问题,结果非常快。例如,显示20个自定义排序和筛选结果的预览不到一秒钟 对于后续产品,由于过去RavenDB的一些问题,我们开始转向MongoDB。MongoDB是我们的

在我们的应用程序中,客户可以创建自己的报告(CSV、Excel、PDF)。在应用程序中,它们可以组合多达30个字段进行过滤,以及多达20个字段进行单独排序(asc&desc)。将立即显示预览

历史与未来 我们开发和运行该应用程序已有几年了。在过去,我们使用NoSql Ravendb3.5,很容易将所有数据放入索引中。查询字段没有问题,结果非常快。例如,显示20个自定义排序和筛选结果的预览不到一秒钟

对于后续产品,由于过去RavenDB的一些问题,我们开始转向MongoDB。MongoDB是我们的首选,因为我们更喜欢NoSql(易于安装,无需ORM、集群、性能、稳定性)和一个很棒的社区,并且有一个受支持的.NET驱动程序。我们在评估期间做了一个简单的POC,一切似乎都很好。也许太简单了

我们的数据是什么样子的? 我们必须在一个集合中查询超过5000万个文档,其结构如下所示:

公共类客户{
公共元数据{get;set;}
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
公共字符串Id{get;set;}
[BsonRepresentation(BsonType.ObjectId)]
公共字符串PersonId{get;set;}
公共int-OrderIndex{get;set;}
公共日期时间事件时间{get;set;}
公共字符串[]作用域{get;set;}//分层数据,例如:12.345.678或12.340.000
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共日期时间出生日期{get;set;}
公共字符串Sex{get;set;}//男性或女性或未知
公共字符串[]标记{get;set;}
公共bool已锁定{get;set;}
公共地址[]地址{get;set;}
公共int?SomeAmount{get;set;}
公共关系[]关系{get;set;}
}
这是客户当前状态(投影)的摘录。我们每天处理数千个变更事件,并将状态存储在一个集合中。 在实际数据结构中,我们有40多个属性。数据结构看起来与旧的应用程序非常相似。事实上,这应该使迁移更容易

用例和问题 我们提供了一个包含多达30个字段的UI,这些字段可以组合、排序和评分

可能的用例:

  • 按姓氏ASC、姓氏ASC、出生日期ASC查找所有30岁以上的男性
    • 查询:出生日期+性别排序:姓、名、出生日期
  • 查找所有居住在纽约并标有“有趣”的人,按姓氏DESC、姓氏ASC、出生日期DESC排序
    • 查询:标签+地址排序:出生日期
    • 注意:排序顺序已更改。地址在数组中
  • 按SomeAmount DESC查找所有锁定的人员
    • 查询:已锁定排序:SomeAmount
  • 如您所见,有几种组合。因此,我们不能仅使用一个索引,原因如下:

    • 复合索引()中字段的严格顺序
    • 复合索引中最多32个字段
    • 索引()中字段的混合排序顺序
    • 单个集合最多只能有64个索引(目前没有问题)
    总结
    • 文件总数:5000万份
    • 平均文档大小:3KB
    • 属性:>40(包括嵌套类型和多个数组)
    • 可查询字段:约30个(可能更多)
    • 可自由排序字段:任意组合和方向最多20个(ASC/DESC)
    技术要求
    • .NET核心
    • NET驱动程序
    问题
  • 我们可以如何按任意排序顺序查询1-n个字段?
    • 每种字段顺序都有多个索引?嗯,似乎非常昂贵(磁盘、性能),别忘了:每个集合最多64个索引
  • 如果我们的客户同时执行40份报告会怎么样?
    • 排序完全在RAM中执行,这可能会对性能造成巨大影响。处理这种负载的好策略是什么
  • 如果我们必须查询超过32个字段,我该怎么办?
    • 添加多个索引并使用?这适用于所有类型的组合吗
    • 将文档拆分为多个部分并使用存储在另一个集合中的引用?而不是我们必须一起工作。嗯,这可能不会表现得很好
  • MongoDB是适合这种复杂查询/报告的数据库吗?
    • 正如你所看到的,我们已经考虑了一段时间,但似乎没有什么适合我们的需要

  • 这是一个非常详细的问题。老实说,如果可能的话,如果你想让人们真正做出回应,你可能会想把这个问题分成几个单独的问题。@PatrickMcvay:我知道,也许你是对的。我提出了一个详细的问题,希望能更好地了解我们的问题。我们的数据库性能存在严重问题。即使是小样本,我们也无法接近预期的时间。当然,并不是同时查询所有字段。但我们为客户提供的高度灵活性使数据库变得非常困难。我们现在决定直接向MongoDB寻求帮助。稍后我会告诉你的。我非常乐意和你一起集思广益。您的查询实际上是什么样子的?顺便说一句,我不是MongoDB方面的专家,但我确实与各种数据库合作,所以我可能会提供帮助。感谢您的支持。我们更详细地调查我们的用例。但看起来我们必须做出一些妥协。MongoDB有一些我们必须处理的限制。在我们与MongoDB进行分析之后,我将给您一个答案。