2012-11-10 45 views
1

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

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

那就是当我们有一个无限循环。无论如何要实现这一目标?也许我不完全理解MongoDB的观点,如果有人能指出我正确的方向,我会很高兴。

谢谢!

回答

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模型,可能会更好。

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

希望这有助于