使用Mongoose aggregate后调用hydrate是否触发二次数据库查询?
关于Mongoose Model.hydrate() 是否触发数据库查询的解答
Model.hydrate() 不会向数据库发起新的查询,它完全是内存内的对象转换操作。
你用aggregate()拿到的是普通JS对象,而hydrate()的核心作用就是把这些对象「包装」成Mongoose文档实例——这个过程只会给对象添加上Mongoose文档的专属特性(比如virtuals、methods、statics、helpers),不会和数据库产生任何交互,更不会重新查询数据。
看你的代码:
const rawDocs = await Model.aggregate([...]); // 这是唯一一次数据库查询 const newDocs = rawDocs.map(doc => Model.hydrate(doc)); // 纯内存操作,无数据库请求
整个流程只会触发一次数据库查询,就是aggregate()执行的那一步,后续的hydrate()转换不会带来额外的数据库开销。
需要注意的是,hydrate()要求传入的对象包含_id字段(Mongoose文档的必要标识),不过aggregate()返回的结果一般都会自带_id,所以你的场景下完全没问题。另外,通过hydrate()生成的文档处于未修改状态,不会自动同步到数据库,除非你主动调用save()等方法。
内容的提问来源于stack exchange,提问作者Epple
相关产品推荐
相关产品推荐

