1

我正在开发一个 asp.net Web 应用程序,它应该为用户提供数千张 JPEG 图像。我的专用服务器包含 JPEG 文件并托管 MongoDB 来存储 JPEG 元数据。

Sample object in a collection named **JPEG_123** (this collection has 1 million such documents and each document has _id indexed)
{ 
    "_id" : "20121210185015000", //YYYYMMDDhhmmsslll 
    "Url" : "http:...", 
    "CameraId" : 123 
}

我正在使用 Web 方法来查询 MongoDB。我使用正则表达式(例如“^2012121018*/)查询集合JPEG_123的 Utc 字段以获取一个小时的文档。它返回 MongoCursor 指向的大约 5000 条记录,在 MongoShell 上它显示检索此数据的时间仅为 3-4 毫秒.

:如何通过 MongoCursor 在 ASP.NET 中以最佳和快速的方式从 MongoDB 迭代获取这些文档?优化使用 LIMIT、BATCHSIZE 和 NEXT 类似 MongoCursor 的属性。

我正在尝试做这样的事情:

  • 上面执行 Find Query on MongoDB from ASP.NET
  • 最初仅通过网络获取前 500 个文档,并将其余 4500 个文档保留在 RAM 中
  • 在 9 次后续迭代中获取该 MongoCursor 中的其余 4500 个文档(每次获取 500)
  • 或任何其他加快通过网络发送此数据的过程的可能性

我的担忧

  1. 当我从 ASP.NET 查询 MongnoDB 时,这是否真的意味着 MongoDB 将所有 5000 条记录加载到 RAM 但不将所有 5000 条记录返回到 ASP.NET?

  2. 发出上述查询后,它立即返回 MongoCursor 指向的记录总数。当我遍历 MongoCursor 中的所有文档时,大约需要 20-30 秒。这是否意味着,MongoDB 在应用程序中使用时会返回数据?

4

1 回答 1

0

我发现使用具有大集合大小的游标运行速度非常慢,除非该集合的索引非常好。您应该注意,在大多数情况下,Regex 会排除使用索引,并且您应该尽可能避免使用这些索引。

默认情况下,游标每批返回 101 个文档或 1 MB 数据。如果您可以通过查看集合统计信息来确定平均文档的大小,则可以利用它来设置最佳限制。您还可以在光标对象中使用一些设置来帮助在一定程度上扩展这些限制。

我可能建议的一件事是,因为与读取相比,写入已经很慢,所以将这些 UTC 字符串作为日期字段传递,让 Mongo 为您解析这些字符串。这样,您既可以索引该字段,又可以在查询中使用正常的日期范围比较。

于 2012-12-20T20:51:14.533 回答