我有一个包含许多嵌入文档(DataPoint)的文档(DataSet)(1:N关系)。因为这在rails中显示为一个数组,如果我想读取每个20个元素,它会将每个元素加载到内存中,还是只加载每个20个元素?
我想知道这是否效率低下。理想情况下,我只想从数据库加载我需要的东西。
以下是一个例子:
a = DataSet.first
points = a.data_points.values_at(*(0..a.data_points.count).step(20))
这不好吗?是否有特定方式来实现这一目标?
答案 0 :(得分:1)
嵌入式文档不是关系(以典型的RDBMS方式),而是实际嵌入(因此名称)在父记录中,就像任何其他属性一样。因此,当您调用DataSet.first
时,您将整个文档及其嵌入的记录加载到内存中。
根据应用程序的结构,您可能会看到将每20个DataPoint
非规范化为单独的嵌入式关系(在回调期间,或在后台任务中,或类似的东西),然后在加载文档时,只加载DataSet.only(:datapoints_sample).first
的那些点 - 这只会将该关系加载到内存中(而不加载其他属性)。