MongoDB预测的效率如何?

MongoDB预测的效率如何?,mongodb,projection,Mongodb,Projection,在查询mongo数据库时,排除文档中几乎所有的数据会有很大的开销吗 例如,如果我只想要字段1和字段2,则对于文档结构为: { "field1" : 1 "field2" : true "field3" : ["big","array",...] "field4" : ["another","big","array",...] } 我是否会从以下方面获益更多: 在此集合旁边创建一个单独的集合,其中包含 仅字段1和字段2,或 对包含/排除参数的原始文档使用.find

在查询mongo数据库时,排除文档中几乎所有的数据会有很大的开销吗

例如,如果我只想要字段1字段2,则对于文档结构为:

{
    "field1" : 1
    "field2" : true
    "field3" : ["big","array",...]
    "field4" : ["another","big","array",...]
}
我是否会从以下方面获益更多:

  • 在此集合旁边创建一个单独的集合,其中包含 仅字段1和字段2,或
  • 对包含/排除参数的原始文档使用.find()
  • 注意:对我来说,两次保存同一数据的低效性并不像查询数据的效率那样重要


    非常感谢

    投影在某种程度上类似于在SQL中显式使用列名,因此,询问返回少量数据是否会比返回大量数据(完整文档)产生开销似乎有点违反直觉

    因此,您必须查找文档(取决于您.find()的速度,它可能快也可能慢),但只返回文档的前两个字段而不是所有字段(完整文档)会使它更快而不是更慢

    只有当您担心自己的收藏是否适合RAM时,拥有第二个收藏可能才有好处。如果复制集合中的文档要小得多,那么它们可以容纳在较小的总RAM中,从而降低页面需要从磁盘交换的可能性。然而,如果您正在写入此集合以及原始集合,那么您必须在RAM中拥有比仅拥有原始集合更多的数据


    因此,虽然复杂的细节可能取决于您的个人设置,但一般答案可能是2。使用投影并只返回所需的两个字段将使您受益匪浅。

    这些文档有多大?@AsyaKamsky每个文档大约有0.3MB,字段1和字段2的组合使文档占用的RAM有所不同,因为当您查询文档时,即使您只需要一些特定的字段,整个文档也可能最终位于RAM中。您想要的两个字段总是前两个字段吗?@AsyaKamsky是的,总是前两个字段,它们的组合大小总是比整个文档的大小小得多。感谢您提供非常详细的答案!还有一个问题,如果我在field1和field2上建立索引,并在这两个字段上查询集合的子集,这是否只会将该子集的数据加载到RAM中?抱歉,我对数据库缺乏了解。只有包含您需要的文档的页面才会加载到RAM中。当然,索引也将在RAM中。