我花了一个好小时来弄清楚一些令人难以置信的事情(至少对我来说,是JS noob),并且我想了解底层的逻辑(或者为什么它如此工作,因为我认为这是不合逻辑的,也是非常意外的。
假设我正在使用Mongoose从数据库中检索文档,其中的一些或全部包括date属性(使用new Date()
创建),数字属性和string属性。
[{
string: 'foo',
date: '2018-10-13T21:11:39.244Z',
number: 10
},
...
{
string: 'bar',
date: '2018-10-13T21:12:39.244Z',
number: 20
}]
因此,我获得了一个对象数组,现在想获取每个对象的date属性并将其值更改为字符串,所以我要做类似的事情:
doc.find({}, (err, list) => {
list.forEach((item, index) => {
list[index].date = 'new value'
})
})
但是我不能这样做!
在该示例中,我可以做list[index].string = 'new value'
以及list[index].date = new Date()
,但是我不能更改其他类型的值date
和number
。
但是,当我做list[index]._doc.date = 'new value'
时,花了很长时间才发现,因为我不知道猫鼬的对象不仅仅是普通的旧对象,而是专注于解决我没有的问题,我可以修改值就可以了。
似乎猫鼬对象只有在值的类型匹配时才将obj.key
转换为obj._doc.key
,但我希望得到比我没有根据的猜测更详细的解释。
答案 0 :(得分:0)
我想您想在文档字段上使用多种类型,当您定义架构时,Mongoose通过“混合”类型支持此类型。
您可以从https://mongoosejs.com/docs/schematypes.html#mixed中获取更多详细信息。