我开始了Mongodb
,你知道这没有relaciones
,没有joins
tablas
等。
我正在尝试将关系图传递给NOSQL
. 我有以下表格。
用户
id
name
消息
idUserFrom
idUserTo
messages
如您所见,该表messages
的 id 为外部users
,尽管 mongo 中没有,但我如何创建它pks
以及fks
如何执行此步骤。
到目前为止,我已经创建了数据库和一个collection
插入表的数据库users
。
> use mongodb
switched to db mongodb
> db
mongodb
> db.users.insert({id:"1",name:"Jorge"})
WriteResult({ "nInserted" : 1 })
> show collections
users
> db.users.find().pretty();
{
"_id" : ObjectId("5c9bbc275a56aa679bb06155"),
"id" : "1",
"name" : "Jorge"
}
collections
我怎样才能使它看起来像这样messages
:这个表包含一些用户的 id,可以是idFrom
或idTo
db.messages.find().pretty();
{
"_id" : ObjectId("5c9bbc275a56aa679bb06155"),
"idFrom" : "xxxxxxxxxx",
"idTo" : "xxxxxxxxxx",
"message" : "Hola"
}
在 MongoDB 中,集合之间存在关系。发生的事情是 Mongo 是一个noSQL数据库。这意味着它不使用结构化查询语言(或英语中的 SQL)。因此,没有类似 的句子
SELECT * FROM table
,因为它是该语言的典型。另一方面,术语“非关系数据库”往往与不存在关系相混淆。事实上,Mongo 允许您实现关系,但通过称为引用的东西。甚至可以平静地谈论关系的基数,具有我们在“关系”数据库中所知道的相同特征。Mongo(以及许多其他noSQL DB )的特殊性在于它不适合或忠实于 ER(实体关系)模型,因此将其描述为非关系数据库。
问题
您想在两个 Mongo 集合之间创建关系。一个名为users的集合将与另一个名为messages的集合有关系。每个类型文档都需要
message
在其两个字段中具有对类型文档的引用user
。解决方案
为了实现我们的建议,我们必须在要创建关系
user
的类型文档的每个字段中创建一个引用。message
Mongo 为我们提供了两种类型的参考手册参考
它们是通过将文档的值放在
_id
另一个文档的字段中使用的。然后,如果要获取关联的文档_id
,则必须使用该值的信息对数据库进行第二次查询。users
假设我们按如下方式创建集合:如果我们想查看
users
我们刚刚创建的集合的对象,我们将使用方法find()
:我们可以看到 Mongo 已将值分配
_id
为 typeObjectId
。它会自动执行此操作,除非我们_id
显式地将字段值传递给它。现在我们将创建集合
messages
并手动输入参考。我们通过以下方式实现这一目标:(我们使用了相应的值
_id
)如果我们想查看集合中的文档,
messages
我们再次使用该方法find()
:现在我们已经手动将集合
messages
中的文档关联到集合中的文档users
。很多时候,这些类型的手动关系对于我们的应用程序来说已经足够了。但是,要知道发送消息或接收消息的用户的姓名或电子邮件,我们必须对数据库进行第二次查询:
在前面的查询中,我在方法中使用了
query
({"_id" : ObjectId("5c9cce340aee604c4ab6cd08")}
)find()
,并且还传递了projection
({"_id":0, "idFrom": 1}
) 作为参数。如果我们想在 SQL 中进行类似的查询,可以这样写:
find()
您可以在文档中找到有关该方法的更多信息DBRef 参考资料
DBRefs是一种用于表示文档的约定,而不是像我们刚刚看到的那样的特定(手动)引用类型。这种类型的引用包括文档所属的集合的名称、
_id
文档字段的值,并且可能包括该集合所属的数据库的名称。文档
DBRef
具有以下格式:(尊重字段的顺序很重要)要在我们的例子中使用类型引用
DBRef
,我们可以这样做:如果我们对我们的集合进行查询,我们将
messages2
获得以下信息:通过这种方式,我们使用. 创建了集合
messages2
和集合之间的关系。users
DBRefs
同样,要知道发送或接收用户的姓名或电子邮件,必须对数据库进行第二次查询
加入
现在,因为问题询问是否可以在 Mongo 中完成 JOIN,所以答案是:是的,使用一个名为 的方法
aggregate()
,正如它的翻译所假设的那样,它为我们的查询添加了一些东西。在这种情况下,我们可以在集合的e_id
字段中添加与 关联的文档。这种类型被称为. 这样我们就可以在单个查询中获取数据。idFrom
idTo
messages
aggregation
$lookup aggregation
在以下查询中可以看到一个简单的示例:
基本上,我们告诉 Mongo在集合中查找与字段e匹配的文档,并将它们添加到 field和 field中返回的文档中。
users
_id
idFrom
idTo
sender
receiver
这转换为 SQL 是一个简单的 JOIN,或者可能是以下类型的查询:
如您所见,几乎所有可以用 SQL 完成的事情都可以在 Mongo 中完成。
希望这是您正在寻找的答案。