【问题标题】:MongoDB - How to query in a large databaseMongoDB - 如何在大型数据库中查询
【发布时间】:2019-02-28 22:36:41
【问题描述】:

我在 MongoDB 中有一个这样的 Order 集合:

{"user_id": 1, "order_id": 1, "order_value": 1000, "createdAt": "2018-09-22T10:32:43.566Z"}
{"user_id": 1, "order_id": 2, "order_value": 2000, "createdAt": "2018-09-23T10:32:43.566Z"}
{"user_id": 2, "order_id": 3, "order_value": 500, "createdAt": "2018-09-24T10:32:43.566Z"}
{"user_id": 2, "order_id": 4, "order_value": 1500, "createdAt": "2018-09-24T10:32:43.566Z"}

问题也很简单,就是按“user_id”计算每个月的总订单价值组:

{"user_id": 1, "total_order_value": 3000, "year": "2018", "month": "09"}
{"user_id": 2, "total_order_value": 2000, "year": "2018", "month": "09"}

我知道并且已经使用的解决方案是在 MongoDB 中使用聚合。但是当用户数和订单数增加十万甚至百万文档时,查询很快就会变慢(查询将由Nodejs服务器执行)。分页也是一个选项,但我需要将所有用户的所有订单值提取到工作表中。

所以,我想针对我的问题以及数据库设计寻求一些建议和进展。非常感谢!

【问题讨论】:

  • 本地测试时查询的大小是多少?
  • 您可以发布您当前使用的聚合查询吗?你的收藏有索引吗
  • 是的,我已经在订单架构中索引了“user_id”

标签: node.js database mongodb mongoose nosql


【解决方案1】:

分页可能是您正在寻找的,因为您将它与同步 node.js 结合起来,您可以运行多个分页查询,从而轻松地限制时间。它的性能会有点重,但我认为你可以轻松处理。

这里有更多信息:
https://github.com/edwardhotchkiss/mongoose-paginate

【讨论】:

  • 是的,很抱歉在问题描述中弄错了。此功能用于将所有用户的全部数据执行到文件(例如:excel表),所以我需要查询所有用户
  • 你有没有想过将你的数据方案替换为不同的模型?我看到您对所有 user_id 都有不同的对象,为什么不通过在数据库中使用数组来组合所有对象。它将为您节省大量检索这些记录的时间。
  • {"user_id":1, "order":[{"order_id": 1, "order_value": 1000, "createdAt": "2018-09-22T10:32:43.566Z"},{"order_id": 2, "order_value": 2000, "createdAt": "2018-09-23T10:32:43.566Z"}]}
  • 那么您所要做的就是获取一条 user_id 为 1 而不是 1000+ 的记录
  • 感谢@Lars Hendriks。由于使用了 Order 模式,由于某些原因,例如获取用户的订单列表和分页、按时间排序……它们,我不能像数组一样将它们存储在模式中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多