gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:00:58 27 4
gpt4 key购买 nike

我有大问题,也许是微不足道的问题。我正在尝试将 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 层获取数据库时,问题就出现了。

这个 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 字段中的值嵌入。然后,如果您希望“使用”该关系,例如查找名为“Aaron”的人创建的所有故事,实际上将有两个查询:

  • 第一个查询将从人员集合中获取人名 Aaron 的 _id,即: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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com