Mongoose DBRef实现与MongoDB文档中的实现不同

时间:2014-01-29 13:36:39

标签: javascript mongodb mongoose

我有一个很大的问题,可能是微不足道的问题。我正在尝试将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还是我做错了什么问题呢?

1 个答案:

答案 0 :(得分:4)

mongoose中的引用是手动引用,而不是dbref(我将在稍后讨论)。在较高的层次上,这里发生的是它将ObjectId人嵌入_creator字段中的值。那么,如果您希望“使用”这种关系,比如通过查找名为“Aaron”的人创建的所有故事,实际上会有两个问题:

  • 第一个查询将从人物集合中获取人物名称Aaron的_id,即:db.people.findOne({"name" : "Aaron"})
  • 第二个查询将使用该_id查找该创作者的所有故事,即:db.stories.find({"creator" : ObjectId("52e7dc001bdedb703df29b8e")})

ORM(在这种情况下是猫鼬)正在为你抽象,允许你定义关系等,而不必知道封面下发生了什么。

当您尝试使用ORM之外的本机驱动程序执行此操作时,您在实际实现这些关系方面犯了一个根本性的错误。它不使用数据库引用,并且通常不鼓励使用它们(参见the docs中关于手动引用的第一个注释),而是使用类似于我上面描述的内容。

如果您希望模拟功能,则应该执行类似的操作,并避免使用数据库引用。