MongoDB和Node JS的交易替代方案和关系

时间:2020-07-17 01:15:43

标签: node.js mongodb

我正在尝试对馆藏实施关系。我的要求是

发布请求1,json正文:

{
  "username":"aaa",
  "password":"bbb",
  "role":"owner",
  "company":"SAS"
}

发布请求2,从第一个文档创建,因此我从上一个json正文中获得了公司名称:

{
  "username":"eee",
  "password":"fff",
  "role":"engineer",
  "company":"SAS"
}

发布请求3,从第一个文档创建,因此我从先前的json正文中获得了公司名称:

{
  "username":"uuu",
  "password":"kkk",
  "role":"engineer",
  "company":"SAS"
}

发布请求4,下一个公司json正文:

{
  "username":"hhh",
  "password":"ggg",
  "role":"owner",
  "company":"GVG"
}

这里公司是外键领域。如何在没有交易失败的情况下建立具有id字段的公司。

在mysql中,如果公司名称ID的任何更新对于所有者和工程师来说都是相同的,我将创建两个表company,user,并使用事务在单个表中使用id插入两个表中。

如何通过node.js在mongodb中实现这些目标?

在在线搜索中,我发现大多数建议避免交易,并使用mongodb内嵌的mongodb功能。

2 个答案:

答案 0 :(得分:1)

我建议您首先使用usercompanymongoose创建模式。它是ODM(目标文档映射器),几乎总是与node.jsmongodb

一起使用

现在这是一对多的关系。在您提到的关系数据库中,您将创建一个company表和一个user表。

在mongodb中,它“依赖”。如果这种关系很少,那么您只需将用户数组嵌套到公司的集合中即可。然后,由于您仅更新单个文档(将用户推送到公司文档中的用户数组),因此无需进行任何交易。单个文档更新始终是原子的(无论您在同一文档上更新了多少个字段)。

但是,如果每个公司可以拥有大量用户(不断增长的嵌套数组不好,因为它可能导致数据碎片和性能下降),那么最好将公司的ID存储在用户文档中。即使在这种情况下,您也不需要交易,因为您不需要更新公司的文档。

将用户存储为单独集合的另一个原因是查询问题。如果您只想查询用户,则很难将其嵌套在公司中。因此,基本上,您需要考虑如何查询并弄清关系的数量,然后决定将商店的嵌套嵌套为单独的集合。

答案 1 :(得分:0)

首先,您应该注意到Mongo是面向文档的数据库,而不是关系数据库。因此,如果您需要事务处理和关系模型,可能应该尝试使用任何SQL相对数据库?特别是如果您更熟悉它们?

关于关系和数据建模:您应该在Mongo官方文档Data Modelling上阅读这篇文章(或整篇文章)。

TL:DR,您可以创建两个单独的集合(与SQL中的表相同),例如employeescompanies(默认情况下,集合的名称为复数形式)。并分别存储数据。

因此,将像上面提到的那样存储您的员工,但是公司将像这样:

{
  _id: ObjectID("35473645632")
  name: "SAS"
}, ...

,对于您的员工集合,您不应该存储"company":"SAS",而应该存储"company":"ObjectID("35473645632"),或者如果需要也可以存储为数组。但是不要忘了编辑架构。

您不仅可以使用MongoDB的默认_id,还可以使用自己的默认字符,它可以是任何唯一的数字/字符串组合

因此,如果您的公司将被重命名,那么您的connection和其他文档(员工)仍将在那里。

要请求所有/任何具有公司名称的员工,您应将.aggregation框架与$lookup一起使用,而不是.find