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

标签 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 读取引用,一切都很好。 但是当数据库由具有自己的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/

相关文章:

node.js - 跳过 Mongoose 中某些更新的时间戳中间件

node.js - 在 Node 中发出 DELETE 请求时如何修复 [ERR_HTTP_HEADERS_SENT]

Javascript if 语句使用 :checked and . 绑定(bind)但只有一个选项有效

javascript - protractor 2.0 通过改变属性获取元素

mysql - 用于小型数据集的 MongoDB

node.js - Mongodb Node JS serverStatus 始终返回 false

javascript - 如何在 Google GeoChart 中使用不同的颜色

处理不同浏览器的JavaScript问题

mongodb - Mongo ids 导致可怕的 URL

arrays - Mongoose 中的子文档数组