在MongoDB中缓存部分文档

时间:2012-12-02 14:01:03

标签: mongodb

我非常熟悉MongoDB中的缓存如何与操作系统的内存映射文件相关。但是,我对它的细节更感兴趣......

比方说,我在一个集合中有这种格式的文档:

{
  _id: ObjectId("..."),
  first_name: "x",
  last_name: "y",
  email: "z"
}
  1. 如果执行了findOne({_id: ObjectId("...")})命令,则整个文档将被放入缓存中。在此之后,如果我运行findOne({_id: ObjectId("...")}, {email: 1}),是否将使用缓存(请注意,在最后一个命令中,我只对电子邮件字段感兴趣)?

  2. 如果我发出findOne({_id: ObjectId("...")}, {first_name: 1, last_name: 1}),整个文档是放入缓存还是只放置投影字段?换句话说,如果我在上一个命令之后运行findOne({_id: ObjectId("...")}),是否会使用缓存?

  3. 谢谢,
    兹拉特科

1 个答案:

答案 0 :(得分:2)

除非您的查询仅由索引满足(即使用covered index),否则加载部分文档的任何操作都会将整个内容分页到内存中。因此,当您重新运行并更改返回的字段时,文档将位于缓存中。

使用投影限制到某些字段只是意味着它不会返回您未指定的字段(因此,就返回的数据而言,它更有效,特别是如果您没有使用大字段)。

注意:你的问题让我思考跨越多个页面的文档,以及是否会产生影响 - 我需要研究/测试,这可能很有趣。

但是,严格来说,放入缓存的内容不仅仅取决于文档或使用的索引。 Readahead也会发挥作用(至少对Linux来说),无论你的文档大小如何,你都会阅读完整的4k页,因此可能存在效率低下的因素。具体取决于您的文档大小和碎片级别。有关该主题的更多讨论可在此处找到:

https://serverfault.com/questions/408100/mongodb-and-datasets-that-dont-fit-in-ram-no-matter-how-hard-you-shove/408182#408182