mongoose查询结果有的时候为model类型
发布于 8 年前 作者 gfafei 7828 次浏览 来自 问答

在使用mongoose的过程中,查询结果有的时候为Object,有的时候为Model,还有里面的_id字段,有的时候是Object,有的时候 是String。我知道可以通过toObject和toString来转化,但到底什么时候需要转化呢,求高人指点。

12 回复

mongoose查询的结果就是一个对象或者是数组,不主要转化可以直接使用的

从mongoose里返回来的ObjectId类型需要toString一下,其他类型都直接用。

自己多次试验,mongoose查询返回的是封装的model对象,读取时直接返回文档结构,调试时才显示出model对象的结构。平时是可以直接使用的,但是需要改动字段的值,就要toObject。

查询的是加上 “lean” 之后返回的就是 json数据了

@liuxuech lean 之后 _id 依然是 ObjectId,不是 String

查询的时候使用.lean(true),返回的结果就是js对象了,但是就失去save等方法

在我初学的阶段我也是认为Mongoose的设计很难以理解,但归根结底还是因为我作为一个开发者并没有了解我对于Mongoose这个工具的需求就盲目去使用,使用Mongoose的目的与Mongoose本身的设计不同,也就很蹩脚了。

首先Mongoose不是MongoDB的驱动,而是ODM(类似于关系数据库的ORM),你要先去搞明白什么是ODM(或ORM,思路差不多),真正的MongoDB驱动应该是 mongodb, 如果你需要的只是一个能连上MongoDB的驱动,然后自己能使用各种增删改查指令在程序里的话,你就不要用Mongoose,而是要npm install mongodb。 如果你明白了ODM的Why What How,你再看一下你自己的项目是不是需要使用ODM,需要用哪种,mongoose也不是唯一的一种,要根据自己的需要来选择。 如果你确定了需要用Mongoose,那么你就要试图理解Mongoose在ODM方面的设计,以及如何使用。 在Mongoose的思想里,数据库里存储的是一个个的Model,你findOne出来的就是一个Model,然后你可以对这个Model进行修改,最后再save,Mongoose会自动根据你的修改调用数据库相关的操作指令,不需要自己update,这就是ODM存在的意义,数据的修改对于开发者来说不是对数据库进行操作,而是对Model进行操作。简单来说ODM就是按照面向对象的思想,把数据也对象化,数据也有自己的方法,只需要调用方法就可以对数据进行操作,而不是自己写数据库的操作语句。 Mongoose的各个方法返回的类型不一样,有的是Model,有的是Array,有的是Query等等,这些官方文档里都有,只不过有一点需要吐槽的是,Mongoose不同的类型可能会有一样名称的方法,但是返回值的类型有可能是不一样的,用起来容易混淆,文档看起来也很混乱。 在真正使用过程当中,你要确定你查询出来的数据是做什么用途,如果是用于处理再存储回去的话就要让其返回Model或者Model的数组,如果不需要再存回去的话就可以用lean方法让Mongoose返回给你JS原生的只包含基本类型的JSON对象。顺便说一句,不是所有的Mongoose返回类型都有lean方法的,要看文档。至于是否要转换成String就要看你的需求了,比如你想使用lodash之类的工具对_id进行各种复杂的操作,这个时候用ObjectId类型就不好用了,因为比如对比两个Object是否相同是一件比较复杂的事情,但是String就很简单,所以这个时候你可能就需要把_id转换成String来处理。

ObjectId存在的意义是本身有除了当一个唯一ID以外的其他用途,比如可以存储时间,比如分布式的时候可以用来区分不同服务器不同数据库实例不同的库产生的文档,具体可以看ObjectId的定义。不知道你什么情况下会返回ObjectId,什么情况下会返回String,贴代码才知道,就像你去看病,你只是说自己不舒服,不说具体是哪里、怎么不舒服、最近吃了什么、做了什么,华佗在世也无法诊断。猜测可能和

@tiant167 toString就行了啊

@libook 多谢大神指定迷津,刚开始接触的时候我也在纠结是用 mongoose 呢还是用 mongodb, 之所以选择用 mongoose 是因为大家都在用,而且 model 层定义好字段后,上线的时候不需要修改数据库的字段(方便好多啊,少犯很多错),结果用了 mongoose 后就开始掉坑了(文档没有仔细看),经常碰到查询结果到的结果无法修改,每次都要 toObject(),或者就是想要更新,虽然显示更新“成功”,实际值并没有更新(因为model 层未定义 xx 字段),诸如此类问题,弄得我很头疼,我也想换成mongodb,但是我也不想上线的时候修改字段,所以我还是“坚持”用 mongoose。

为什么不用mysql加sequelize?

model.find().lean()

得到的结果就是object

@isbdnt mongodb和mysql还是有区别的。。。

回到顶部