C# MongoDB中的报告:查询中参数的单独组合 我们想做什么
在我们的应用程序中,客户可以创建自己的报告(CSV、Excel、PDF)。在应用程序中,它们可以组合多达30个字段进行过滤,以及多达20个字段进行单独排序(asc&desc)。将立即显示预览 历史与未来 我们开发和运行该应用程序已有几年了。在过去,我们使用NoSql Ravendb3.5,很容易将所有数据放入索引中。查询字段没有问题,结果非常快。例如,显示20个自定义排序和筛选结果的预览不到一秒钟 对于后续产品,由于过去RavenDB的一些问题,我们开始转向MongoDB。MongoDB是我们的首选,因为我们更喜欢NoSql(易于安装,无需ORM、集群、性能、稳定性)和一个很棒的社区,并且有一个受支持的.NET驱动程序。我们在评估期间做了一个简单的POC,一切似乎都很好。也许太简单了 我们的数据是什么样子的? 我们必须在一个集合中查询超过5000万个文档,其结构如下所示: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是我们的
公共类客户{
公共元数据{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,这些字段可以组合、排序和评分
可能的用例:
- 查询:出生日期+性别排序:姓、名、出生日期
- 查询:标签+地址排序:出生日期
- 注意:排序顺序已更改。地址在数组中
- 查询:已锁定排序:SomeAmount
- 复合索引()中字段的严格顺序
- 复合索引中最多32个字段
- 索引()中字段的混合排序顺序
- 单个集合最多只能有64个索引(目前没有问题)
- 文件总数:5000万份
- 平均文档大小:3KB
- 属性:>40(包括嵌套类型和多个数组)
- 可查询字段:约30个(可能更多)
- 可自由排序字段:任意组合和方向最多20个(ASC/DESC)
- .NET核心
- NET驱动程序
- 每种字段顺序都有多个索引?嗯,似乎非常昂贵(磁盘、性能),别忘了:每个集合最多64个索引李>
- 排序完全在RAM中执行,这可能会对性能造成巨大影响。处理这种负载的好策略是什么
- 添加多个索引并使用?这适用于所有类型的组合吗
- 将文档拆分为多个部分并使用存储在另一个集合中的引用?而不是我们必须一起工作。嗯,这可能不会表现得很好
- 正如你所看到的,我们已经考虑了一段时间,但似乎没有什么适合我们的需要
这是一个非常详细的问题。老实说,如果可能的话,如果你想让人们真正做出回应,你可能会想把这个问题分成几个单独的问题。@PatrickMcvay:我知道,也许你是对的。我提出了一个详细的问题,希望能更好地了解我们的问题。我们的数据库性能存在严重问题。即使是小样本,我们也无法接近预期的时间。当然,并不是同时查询所有字段。但我们为客户提供的高度灵活性使数据库变得非常困难。我们现在决定直接向MongoDB寻求帮助。稍后我会告诉你的。我非常乐意和你一起集思广益。您的查询实际上是什么样子的?顺便说一句,我不是MongoDB方面的专家,但我确实与各种数据库合作,所以我可能会提供帮助。感谢您的支持。我们更详细地调查我们的用例。但看起来我们必须做出一些妥协。MongoDB有一些我们必须处理的限制。在我们与MongoDB进行分析之后,我将给您一个答案。