1

我是 MongoDB 的初学者,我正在尝试解决我在使用关系数据库时遇到的一个问题(使用 Django)。我有一个SongAlbum模型,我希望每首歌都有对其专辑的引用,并且每张专辑都有一个包含所有歌曲的列表。是否有可能在 MongoDB 中有这样的东西:

{
'song_title': 'In mist she was standing',
'album': {
   'album_title': 'Orchid',
   'songs': [ { song_title: 'Requiem', album:{'album_title':'Orchid', 'songs':[{song_title'.... 

那就是我们有一个无限循环的时候。有没有办法做到这一点?也许我没有完全理解 MongoDB 的意义,如果有人能指出我正确的方向,我会很高兴。

谢谢!

4

1 回答 1

0

我的建议是在开始时保持简单:两个集合AlbumSong就像在任何其他关系数据库中一样。

我假设您使用 mongoengine 作为 ORM。

class Album(Document):
    album_title = StringField()
    songs = ListField(ObjectIdFIeld())
    meta = {
       'indexes': ['songs'],
       'allow_inheritance': False,
    }

class Song(Document):
    song_title = StringField()
    album = ObjectIdField()
    meta = {
       'indexes': ['album']
    }

每次你获取一个Album你可以用第二个查询来获取它的歌曲(mongodb没有连接的概念):

album = Album.objects.all().first() # just an example
songs = Song.objects.filter(id__in=album.songs)

另一种可能性是将歌曲完全嵌入专辑中:

class Song(EmbeddedDocument):
    song_title = StringField()

class Album(Document):
    album_title = StringField()
    songs = ListField(EmbeddedDocumentField(Song))

如果您的查询(几乎)全部来自Album模型,可能会更好。

无论如何,我建议从两个表设置开始,然后您可以通过将歌曲数据嵌入专辑来提高性能。

希望这可以帮助

于 2012-11-11T00:00:15.220 回答