查看ObjectIds时出现奇怪的猫鼬行为?

时间:2015-07-07 23:28:09

标签: node.js mongodb mongoose

使用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

1 个答案:

答案 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,存储为ObjectIdviewData日期)。

这会混淆Mongoose,因为它试图将第二个模式应用于使用第一个模式编写的文档,因此,它显示了ObjectId对象的内部表示,而不是字符串化版本。

这也解释了为什么.lean()显示正确的结果,因为它告诉Mongoose返回原始文档(因为它们存储在数据库中)而不是尝试根据模式转换它们。