1

一周前我开始学习 MongoDB,但我被困在关系上。更像是我很困惑。我知道何时使用嵌入式关系以及何时使用引用关系。我知道嵌入式关系有一些缺点,这就是为什么我们更喜欢引用关系而不是嵌入式关系。现在,我正在学习 DBRefs。问题是,无论如何我都觉得它没有帮助。那就是我所想的。我希望我错了。

在 DBrefs 中,我们可以在不同集合中的一个文档中引用来自不同集合的文档。在 RefRels 中,我们可以在不同集合中的一个文档中引用来自不同集合的不同文档。

我的意思是,我们可以使用 DBrefs 执行我们可以使用引用关系执行的相同操作。

在引用关系中,我们在文档的集合中创建一个字段,并存储来自不同集合的文档的 ObjectId,如下所示:

> db.Employee.insert({"Emp_Name":"Emp_1", "Emp_Address":[ObjectId("some_id_from_Address_collection"), ObjectId("some_id_from_Address_collection"), ObjectId("some_id_from_Address_collection")], "Emp_Phone":[ObjectId("some_id_from_Phone_collection"), ObjectId("some_id_from_Phone_collection"), ObjectId("some_id_from_Phone_collection")]})

在 DBrefs 中,我们在文档的集合中创建一个字段,并使用 ObjectIds 存储值,就像我们在引用关系中所做的那样,但方式不同。考虑以下示例:

> db.Employee.insert({"address": {"$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "tutorialspoint"}, "name": "Tom Benzamin"})

我们仍在使用 ObjectId 将值存储在 Employee 集合中,但语法不同,因为在此示例中,我们提到要查看哪个 DB 和 Collection。

为什么不直接使用引用关系并节省时间,而不是使用这种令人困惑且冗长的查询并浪费一半时间?

我错过了什么吗?

我什至应该考虑学习 DBrefs 吗?

4

1 回答 1

1

DBRef 的重点是它允许从单个字段引用数据库和集合。没有它,您将需要两个字段[*]。

[*] 从技术上讲,您可以使用单个字段,例如,包含数据库和集合引用的 Hash 本身,但这本质上与 DBRef 相同,但没有标签。

如果您想引用其他数据库中的文档,DBRef 可能会很有用。它的实用性受到以下事实的限制:通常您仍然需要在应用程序中处理跨数据库操作,因为驱动程序和服务器通常不会为您无缝地完成此操作。例如, DBRef不能直接用于聚合框架

DBRef 实际上只是提供了一种更方便的方式来存储数据库+集合名称对。

如果您的所有集合都在同一个数据库中,则根本不需要 DBRef(实际上它只会妨碍您)。

我什至应该考虑学习 DBrefs 吗?

它们在很大程度上是一个利基功能。可能不是。

于 2020-05-02T01:26:45.467 回答