【问题标题】:Does querying certain fields only save query time in mongodb?查询某些字段是否只会节省mongodb中的查询时间?
【发布时间】:2020-06-26 00:18:55
【问题描述】:

querying certain fields only 在 mongodb 查询中是否节省查询时间?

假设我有一个如下所示的架构。

const CommentSchema = new mongoose.Schema({
    commentText:{
        type:String,
        required: true
    },
    arrayOfReplies: [{  
        replyText:{
            type:String,
            required: true
        },
        likes: [{
            objectIdOfUser: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'User',
                required: true,
            },
        }],
    }],
});

我试图找出 mongodb 是否查询整个文档然后过滤它,或者过滤是否发生在 mongodb 内部。

如果我有一个大的arrayOfRepliesarray,例如 500,000 个回复。与查询整个文档相比,下面的查询as shown the mongoose docs 会节省查询时间吗?

Comment.findById(id, 'commentText', function (err, comment) {});

编辑

我之前曾问过这个问题(见下文)。我已经改变了我的问题,以反映我真正想问的问题。虽然下面查询的问题的答案仍然存在。

Comment.findById(id, 'replyText', function (err, comment) {});

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    仅投影您需要的字段在某些情况下会影响性能。

    如果投影允许查询完全为covered,则由于根本不需要加载文档,因此可能会有显着的改进。您可以使用explain 运行查询以查看是否需要fetch 阶段。

    mongod 会将整个文档从磁盘中取出到缓存中,然后将需要的数据从缓存中复制到响应中。

    如果查询返回大量文档,减少每个文档返回的数据量将减少在网络上发送它所需的时间,并允许更多文档适合单个响应批次,从而减少网络开销.

    在您的查询示例中,查找单个评论并获取replyText 数组,您可能会看到通过不包括点赞来减少通过网络发送的数据量的一些微不足道的收益。 (这是假设您实际上并未索引 replyText)

    【讨论】:

    • 谢谢,但我在问题中犯了一个错误。我的意思是commentText 而不是replyText 会忽略arrayOfReplies 对查询性能的帮助?请更新您的答案,以便它可以回答这两个问题,以便任何有兴趣的人都可以从信息中获得帮助。谢谢。
    • mongod 仍会从磁盘中提取整个文档,但省略 replyText 可能会显着减少网络流量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多