老实说,这个问题我之间也是遇到过,当初我是想修改这个doc的属性,但是死活没有办法修改,当初也是花了很久找到原因。这次我就把这个问题好好地研究一下。
先说结果,以及解决方法把。我比较喜欢剧透。愿意是因为再次返回的doc是属于Document的实例,而不是一个普通的对象。也就是说它和普通的对象是不一样的,它没有普通对象的一些方法,普通对象也没有它身上的一些方法。
解决方案有几种,不过究其根本都是将这种document转化为普通的对象:
方法1:
利用toObject方法
docs.forEach(doc => {
return doc.toObject();
})方法2:
利用JSON方法,这是我想到的一个方法,具体深层原因在这就不展开了:
docs = JSON.stringify(docs);
docs = JSON.parse(docs);方法3:
利用lean方法:
model.find().lean().exec((err, docs) => {
....
})上述的三种方法应该都能成功将find获取的结果转化为普通的对象。
但是我还想知道到底document和一个普通的对象到底有什么区别,区别在哪里呢?
我们假设find获取的结果是docs,转化为普通对象的结果是docs1。现在我们就看一看这二者的区别。理论上docs和docs1都应该是数组,而它们中元素都应该是一个对象,我们先来看看是不是这样呢?
console.log(Object.prototype.toString.call(docs));
consoele.log(Object.prototype.toString.call(docs[0]));console.log(Object.prototype.toString.call(docs1));
console.log(Object.prototype.toString.call(docs1[0]))
我们通过上述方法可以获取docs以及docs1的类型以及其中元素的类型,结果是:
[object Array][object Object][object Array][object Object]和我们预想中的一模一样,那问题不在这,那我们就探究探究docs[0]以及docs1[0]的原型把,看看它的原型到底是什么呢?知道JS的人,应该都知道JS中的原型链。在此,我们就通过__proto__来粗暴地获取对象的原型:
console.dir(doc[0].__proto__);console.dir(docs[0].__proto__);
结果是:
model {
db:
NativeConnection {
base:
Mongoose {
connections: [Array],
models: [Object],
modelSchemas: [Object],
options: [Object],
plugins: [Array] },
collections: { realestates: [Object] },
models: { realestate: [Object] },
config: { autoIndex: true },









