使用Mongo DB进行一对多映射

时间:2019-05-09 07:17:14

标签: java mongodb spring-boot spring-data-mongodb

我是mongodb的新手,正在寻求设计一些RDBMS可以直接实现的功能。

我有一个音乐艺术家的现有文档,每个艺术家都有一个“艺术家别名”(字符串)集合。我的目标是确保只有一位艺术家确实在我的数据库中一次,但是由于许多艺术家具有多种拼写和名称,因此我创建了别名集合,因此我将能够知道这些其他拼写和名称实际上与此链接在一起。我的数据库中有1位特定的艺术家。使用传统的关系数据库,我可以轻松地做到这一点,方法是使用别名的联接表,然后使用FK指向相应的艺术家。但是我不确定如何使用Spring-Data在MongoDB中解决这个问题。

我不确定是否需要创建Artist对象以及ArtistAlias对象,或者是否只有一种方法可以将ArtistAlias信息嵌入到artist对象中并从那里搜索。我知道我可以嵌入信息,但是我不确定如何查询....例如,例如,如果我的数据库中存储了一个名为“ Michael Jackson”的艺术家,但是他的别名为“ MJ”只是想进行搜索,但是要拉回完整的“ Micahel Jackson”艺术家信息,是否可以不必创建单独的文档来保存所有ArtistAlias对象的方法来实现?

当前:

@Document(collection = "artist")
public class Artist
{
    @Id
    private String id;

    @TextIndexed
    private String artistName;

    @TextScore
    private Float textScore;

    private Set<String> artistAliasSet;
}

我知道我能做的

@Document(collection = "artist")
public class Artist
{
    @Id
    private String id;

    @TextIndexed
    private String artistName;

    @TextScore
    private Float textScore;

    private Set<ArtistAlias> artistAliasSet;
}
@Document(collection = "artist_alias")
public class Artist
{
    @Id
    private String id;

    @TextIndexed
    private String aliasName;

    @TextScore
    private Float textScore;

    private Artist artist;
}

但是,这种方法确实让我感到担忧,因为新歌手不断被添加到数据库中,并且由于直到保存之后才分配新歌手或别名的ID,这意味着添加新歌手时,我会每次必须向数据库发出3次调用。首先,我需要使用“艺术家”字段将别名保存为空,以获取别名ID,然后我需要使用新近学习的别名信息来保存艺术家,以获取艺术家的ID,最后我需要返回并使用新的歌手ID和保存后我得到的信息来更新别名。我觉得必须要有一个更好的方法。

2 个答案:

答案 0 :(得分:1)

NoSQL世界中不存在关系世界中的一对多关系。您可以通过类似的方式来模仿类似的东西,即可以在另一个文档下存储文档集合(诸如父子关系)。您可以找到更多的here

答案 1 :(得分:1)

如果假定别名仅由artist对象引用,则无需创建单独的集合,您可以将它们作为alias数组嵌入到Artist中。 Here您可以找到有关何时需要嵌入和何时引用的一些注意事项。

如果您有一个artists集合,其中包含类似对象

{
    "name": "Michael Jackson",
    "alias": [
        "mj",
        "king of the pop"
    ]
}

您可以使用

db.artists.find({"alias": "mj"})

查询所有alias是包含字符串“ mj”作为其元素之一的数组的文档。

也请向官方documentation查询查询数组。