【问题标题】:Mongoose DBRef implementation is not the same like in MongoDB documentationMongoose DBRef 实现与 MongoDB 文档中的不同
【发布时间】:2014-02-21 08:27:45
【问题描述】:

我有一个大问题,也许是微不足道的问题。我正在尝试将 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 读取引用,一切都很好。 但是当 db 被具有自己的 mongoDB 层的 Java 程序获取时,就会出现问题。

这个 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 还是我做错了什么?

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

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

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

    ORM(在这种情况下为猫鼬)正在为您抽象,并允许您定义关系等,而无需了解幕后发生的事情。

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

    如果您希望模拟该功能,您应该做类似的事情,并避免使用数据库引用。

    【讨论】:

    • 好的。我理解你,但我担心当 db 由 Java 应用程序提供并创建另一个结构而不是 mongoose 时,如何将这些文档与引用一起使用。
    • 要么你需要模拟猫鼬引用,要么你需要在两种访问方法之间提供一个兼容的模式。绝对保持兼容性的唯一现实方法可能是使用 node.js 本机驱动程序在 mongoose 之外实现所需的引用并自己维护它们。否则,即使您在 Java 中模拟 mongoose,mongoose 的任何更改(升级)都可能破坏您的 Java 访问权限,反之亦然。
    猜你喜欢
    • 2019-10-30
    • 2014-02-24
    • 2015-10-04
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多