使用Robomongo查看子文档时,我看到如下内容:
"views" : [
ObjectId("53a478431275cf0f3d91e27d"),
ObjectId("53a478431275cf0f3d91e27d")
]
但是当我通过Mongoose将对象下拉到node.js时,我看到这样的东西:
views:
[ { _bsontype: 'ObjectID',
id: 'T\u001aôj#Ü«m¢©Ö',
viewDate: '2015-07-07T23:21:32.259Z' } ]
是的,架构有点不同,我正在尝试编写一个脚本来将数据修复为新格式。
架构目前是
views: [{view:{type: Schema.Types.ObjectId, ref: 'users'},viewDate:{type: Date, default: Date.now}}],
但是
A)为什么视图对象在后者中看起来都搞砸了,而且
B)我怎样才能看到我在Robomongo看到的东西? (已回答。见编辑)
编辑:问题B已得到解答。如果我对我的查询.lean()
,那么我将能够将其作为非猫鼬对象取回,并且它将看起来我期望它看起来如何。这就是问题A
答案 0 :(得分:0)
我设法重现了这个。
首先,您声明了一个与此类似的架构:
views : { type : Schema.Types.ObjectId, ref : 'users' }
您使用该架构创建并将文档写入数据库。
然后您将架构更改为当前:
views: [{
view : { type: Schema.Types.ObjectId, ref: 'users' },
viewDate : { type: Date, default: Date.now }
}]
使用该架构,您正在阅读使用第一个架构写入数据库的文档。
这些架构根本不同:第一个在数据库中存储为单个ObjectId
(术语“子文档”有点令人困惑,因为在Mongoose中,子文档是文档,与其父文档一起存储;您正在使用的方法在Mongoose-speak中称为“population”,但第二个模式使views
成为具有两个属性的文档的数组( view
,存储为ObjectId
和viewData
日期)。
这会混淆Mongoose,因为它试图将第二个模式应用于使用第一个模式编写的文档,因此,它显示了ObjectId
对象的内部表示,而不是字符串化版本。
这也解释了为什么.lean()
显示正确的结果,因为它告诉Mongoose返回原始文档(因为它们存储在数据库中)而不是尝试根据模式转换它们。