0

假设我有一个应用程序接收带有两个参数的请求:X 和 Y。我要做的就是计算这些请求,并且我想使用 MongoDB 来完成任务。

我可以想到两种方法将这些信息存储在 MongoDB 中:

1. 对 X 和 Y 的每个组合都有一个文档:

{
  _id : "X+Y",
  count : 34
}

2. 将 Y 嵌入到 X 中,这意味着每个 X 都有一个文档,该文档总结了带有该 X 的所有请求:

{
  _id : "X",
  total_count : 47,
  y: {
      "Y1" : 34,
      "Y2" : 13
   }
}

这些方法的优缺点是什么?
一种方法是否被认为是最佳实践?我还缺少另一种合法的方法吗?这是一个常见的困境吗?

我一直在阅读 MongoDB 的手动数据建模部分和讨论此问题的常见问题解答,但我并不满意。

谢谢

更新

我的应用预计每天处理50M左右的请求,而每个请求包含几个属性(比如X和Y),但是数量比较少(4-5个),每个请求都要统计(或者通过insert或更新)。
这些数据将每隔一小时左右查询一次,并且查询预计会使用聚合。这些查询通常会查询最近几天(最多一周)的数据。

4

2 回答 2

0

拥有这样的抽象文档很难给出建议,但请避免使用非描述性的键(或值作为键)。请使用文档的真实示例更新您的问题,以及您认为需要使用哪些查询(插入、更新和查找)。这些是可用于设计适当模式的唯一标准。

于 2013-08-01T16:54:52.820 回答
0

如果您认为可能需要按 X 分组的总计数,请坚持使用第二种方法。此外,如果您有可能需要将其按 Y 分组,那么对您的数据进行非规范化并存储嵌入在 Ys 中的 Xs 以及嵌入在 Ys 中的 Xs 并不是一个坏习惯。那是因为 mongo 在聚合方面表现不佳。

如果您确定不需要任何类型的聚合,则第一种方法会更好,因为它可以更快地读/写和更少的磁盘空间使用。

或者,如果您不完全确定,请将其存储为:{x: "X", y: "Y", count: 42}. 确保为此创建索引{x: 1, y: 1}。这样,您仍然可以选择按“X”或“Y”检索所有文档。请注意,拥有{x: 1, y: 1}索引意味着您不需要为{x: 1}“X”查询创建索引,只需{y: 1}通过“Y”查询。

于 2013-08-01T16:26:44.233 回答