为什么要在Mongoose查询中排除.lean()?

为什么要在Mongoose查询中排除.lean()?,mongoose,Mongoose,我很想知道在猫鼬查询中不使用.lean()有什么好处。Mongoose响应中的额外开销实际上允许您做什么 我发现,除非在查询中使用.lean()方法,否则很难处理作为对象返回的文档 我错过什么了吗?在我的应用程序中使用Mongoose文档之前,如果将它们剥离掉,我会失去很多未开发的好处吗?我还没有进行过精确的测试,但这很好地比较了不使用和使用.lean()的Mongoose查询的执行时间方法,它清楚地表明,一个没有它的方法几乎是一个.lean()方法的3倍。这篇文章将其归因于.lean()方法只

我很想知道在猫鼬查询中不使用
.lean()
有什么好处。Mongoose响应中的额外开销实际上允许您做什么

我发现,除非在查询中使用
.lean()
方法,否则很难处理作为对象返回的文档


我错过什么了吗?在我的应用程序中使用Mongoose文档之前,如果将它们剥离掉,我会失去很多未开发的好处吗?

我还没有进行过精确的测试,但这很好地比较了不使用和使用
.lean()的Mongoose查询的执行时间
方法,它清楚地表明,一个没有它的方法几乎是一个
.lean()方法的3倍。这篇文章将其归因于
.lean()
方法只返回一个javascript对象,通过这样做,所有“月亮鹅魔术”以及方法(包括save等)和getter/setter的条带都会返回

一方面,我想说,它有助于在向用户发送响应之前快速向返回对象添加新字段,如下所示:

.then(result=>{
    result.something = "another thing";
    return res.json(result);
})
请注意,没有
.lean()
的查询不会返回javascript对象,因此您需要将结果转换为javascript对象,然后再使用语法向对象添加新字段,甚至删除,如下所示

.then(result=>{
    result = result.toObject();
    delete result.something; 
    return res.json(result);
})
您可以在上面找到相关信息,因为它引用了“这是高性能只读方案中的一个很好的选项,尤其是与流相结合时。”