我有一个很大的问题,可能是微不足道的问题。我正在尝试将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读取引用,则一切正常。 但是当Java程序使用自己的mongoDB层获取db时会出现问题。
这个Java程序在db中添加类似的东西(这是另一个不看匹配字段的例子):
//other fields
"user": {
"$ref": "users",
"$id": {
"$oid": "52c6c497c08e6fcf37000001"
}
}
当我们转到MongoDB(http://docs.mongodb.org/manual/reference/database-references/#dbrefs)的文档时,我们可以读取该引用属性需要$ref
和$id
字段。
因为错误的实现mongoDB DBRef类型进入mongoose还是我做错了什么问题呢?
答案 0 :(得分:4)
mongoose中的引用是手动引用,而不是dbref
(我将在稍后讨论)。在较高的层次上,这里发生的是它将ObjectId
人嵌入_creator
字段中的值。那么,如果您希望“使用”这种关系,比如通过查找名为“Aaron”的人创建的所有故事,实际上会有两个问题:
_id
,即:db.people.findOne({"name" : "Aaron"})
_id
查找该创作者的所有故事,即:db.stories.find({"creator" : ObjectId("52e7dc001bdedb703df29b8e")})
ORM(在这种情况下是猫鼬)正在为你抽象,允许你定义关系等,而不必知道封面下发生了什么。
当您尝试使用ORM之外的本机驱动程序执行此操作时,您在实际实现这些关系方面犯了一个根本性的错误。它不使用数据库引用,并且通常不鼓励使用它们(参见the docs中关于手动引用的第一个注释),而是使用类似于我上面描述的内容。
如果您希望模拟功能,则应该执行类似的操作,并避免使用数据库引用。