我有一个可能很小的问题的大问题。我正在尝试将 reference
与 mongoose.js 用于 MongoDB 数据库。让我们看一下这个例子:
示例代码:
https://gist.github.com/hastebrot/1170907
当我运行此代码时,我的数据库中有类似的内容:
> db.stories.find()
{
"title" : "A man who cooked Nintendo",
"_creator" : ObjectId("52e7dc001bdedb703df29b8e"),
"_id" : ObjectId("52e7dc001bdedb703df29b8f"),
"fans" : [ ], "__v" : 0
}
> db.people.find()
{
"name" : "Aaron",
"age" : 100,
"_id" : ObjectId("52e7dc001bdedb703df29b8e"),
"stories" : [ ], "__v" : 0
}
问题出在哪里?
如果我使用 Mongoose 插入数据并使用 Mongoose 读取引用,一切都很好。 但是当数据库由具有自己的mongoDB层的Java程序获取时,就会出现问题。
这个Java程序将类似的内容添加到数据库中(这是另一个示例,不要查看不匹配的字段):
//other fields
"user": {
"$ref": "users",
"$id": {
"$oid": "52c6c497c08e6fcf37000001"
}
}
当我们查看 MongoDB ( http://docs.mongodb.org/manual/reference/database-references/#dbrefs ) 文档时,我们可以看到引用属性需要 $ref
和 $id
字段。
问题:
那么这是错误地将 mongoDB DBRef 类型实现为 mongoose 的问题还是我做错了什么?
最佳答案
mongoose中的引用是手动引用,而不是dbref
(其用途我将在稍后讨论)。从高层次来看,这里发生的是它嵌入 ObjectId
作为 _creator
中的值的人 field 。然后,如果您希望“使用”该关系,例如通过查找名为“Aaron”的人创建的所有故事,则实际上会出现两个查询:
- 第一个查询将获取
_id
人物集合中 Aaron 的人名,即:db.people.findOne({"name" : "Aaron"})
- 第二个查询将使用
_id
查找该创作者的所有故事,即:db.stories.find({"creator" : ObjectId("52e7dc001bdedb703df29b8e")})
ORM (在本例中为 Mongoose )正在为您抽象这一点,并允许您定义关系等,而无需了解幕后发生的事情。
当您尝试使用 ORM 之外的 native 驱动程序执行此操作时,您在它如何实际实现这些关系方面犯了一个根本性错误。它不使用数据库引用,并且通常不鼓励使用它们(请参阅 the docs 中有关手动引用的第一个注释),而是使用与我上面描述的类似的内容。
如果您希望模拟该功能,您应该执行类似的操作,并避免使用数据库引用。
关于javascript - Mongoose DBRef 实现与 MongoDB 文档中的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21432717/