mongo数据库中 _id 和 $oid 的区别; $date 和 IsoDate 的区别

16

我们正在使用MongoDB来存储生产数据库中的某些记录。

我们在生产数据库中看到我们的记录具有"_id" : { "$oid" : "50585fbcb046b2709a534502"},而我们在qa数据库中看到相同的记录为"_id" : ObjectId(" 50585fbcb046b2709a534502 ")。 对于日期,我们在生产数据库中看到"ld" : { "$date" : "2011-12-03T17:00:00Z"},而在qa数据库中看到"ld" :ISODate("2011-12-03T17:00:00Z")。 我们已经在qa环境中成功测试了我们的查询,但担心在生产环境中可能会失败。

1)我的Java查询在prod和qa上都能无缝工作吗?(我正在使用morphia APIs进行查询) 2)它们在内部是以完全相同的方式存储的吗?


对于任何试图从mongo命令行客户端获取纯JSON(例如{"$oid": x}而不是ObjectId(x))的人,请注意使用mongoexport代替。 - rakslice
1个回答

17

回答这两个问题:

  1. 是的,它们会。
  2. 是的,它们是相同的,只是在你查看的项目中(控制台或应用程序)中表示方式不同。控制台(至少是1.4左右的版本)将显示 ObjectIdISODate(通常情况下),而直接从服务器语言(在你的情况下是Java)中提取时,则倾向于显示完整对象属性(在本例中为 $oid$date)。

所以这与任何驱动程序版本等都无关?实际上,这很容易理解,因为在“prod”中,我们使用工具查看数据,而在“qa”中,我们使用命令行查看插入的数据。 - Kumar Manish
@KumarManish 嗯,所有驱动程序版本在这方面都应该保持一致,是的,该工具只是以完全纯文本格式获取数据(甚至在其端进行翻译以使其看起来像那样),而控制台会将您文档中的所有对象都进行翻译。 - Sammaye
我刚刚与手动登录到生产数据库的某人进行了验证,我确实看到qa和prod版本完全相同。 - Kumar Manish
我实际上发现了一个情况,即在同一环境中使用相同驱动程序的2个对象,在同一台计算机上使用相同版本的Java驱动程序(3.3.0)返回了2个不同的值。现在我的应用因此失败了。http://stackoverflow.com/questions/39603179/excluding-fields-when-retrieving-document-from-mongodb - juminoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接