MongoDB中部分文档的缓存

MongoDB中部分文档的缓存,mongodb,Mongodb,我非常熟悉MongoDB中的缓存如何与操作系统映射的内存文件相关。然而,我对它的细节更感兴趣 比如说,我在一个集合中收集了这种格式的文档: { _id: ObjectId("..."), first_name: "x", last_name: "y", email: "z" } 如果执行findOne({u id:ObjectId(“…”)})命令,则整个文档将放入缓存中。在此之后,如果我运行findOne({u id:ObjectId(“…”)},{email:1}),是否将

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

比如说,我在一个集合中收集了这种格式的文档:

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

  • 如果我发出
    findOne({u id:ObjectId(“…”)},{first\u name:1,last\u name:1})
    ,那么整个文档是放在缓存中,还是仅仅放在投影字段中?换句话说,如果在上一个命令之后运行
    findOne({u id:ObjectId(“…”)})
    ,是否会使用缓存

  • 谢谢,

    Zlatko

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

    使用投影来限制某些字段只意味着它不会返回您未指定的字段(因此它在返回数据方面更有效,特别是在您没有使用大字段的情况下)

    注意:你的问题让我想到了跨越多个页面的文档,以及than是否会产生影响——我需要研究/测试一些东西,这可能会很有趣

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


    谢谢,这正是我想知道的!