Mongoengine和add_to_set似乎无法正常工作

时间:2015-10-05 19:18:08

标签: mongodb python-2.7 mongoengine

我试图将对mp3的引用保存到数据库中。我将艺术家,歌曲和专辑保存到各自的模式中,并通过ReferenceFields在它们之间进行引用。

我使用eyeD3来解析id3数据(如果有的话),并将其保存到数据库中。我的问题是我想同时保存所有三种模式类型,但我可能会采用错误的方式。我正在使用python 2.7.10。

示例模式:

class Artist(db.Document):
    """Schema for Artist"""
    name = db.StringField(max_length=255, required=True, unique=True)
    albums = db.ListField(db.ReferenceField('Album'))
    songs = db.ListField(db.ReferenceField('Song'))

    def __unicode__(self):
        return self.name

class Album(db.Document):
    """Schema for albums"""
    title = db.StringField(max_length=255, required=True, unique=True)
    artist = db.ReferenceField(Artist)
    songs = db.ListField(db.ReferenceField('Song'))

    def __unicode__(self):
        return self.title

class Song(db.Document):
    """Schema for songs"""
    title = db.StringField(max_length=255, required=True, unique=True)
    artist = db.ReferenceField(Artist)
    album = db.ReferenceField(Album)
    path = db.StringField(max_length=255, required=True)

    def __unicode__(self):
        return self.title

和保存到db的代码:

for root, dirs, files in os.walk(dir):
    for f in files:
        if '.mp3' in f:
            id3 = eyed3.load(os.path.join(root, f))
            song = Song(title=id3.tag.title, path=os.path.join(root, f))
            album = Album(title=id3.tag.album)
            artist = Artist(name=id3.tag.artist)

            song.save()
            album.save()
            artist.save()
            Artist.objects(id=artist.id).update(add_to_set__albums=album, add_to_set__songs=song)
            Album.objects(id=album.id).update(artist=artist, add_to_set__songs=song)
            Song.objects(id=song.id).update(artist=artist, album=album)

保存后,add_to_set只将一个对象保存到每个ListField,而不是将其推送到最后。

我很难弄清楚如何正确地做到这一点。任何帮助,将不胜感激。感谢

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了罪魁祸首。因为模式的某些属性是唯一的,所以当我将对象分配给已经插入到db中的变量时:

artist = Artist(name=id3.artist)

它返回一个dulpicate错误。然后我尝试使用该变量推送到另一个对象:

Album.objects(title=id3.album).update(artist=artist)

但由于重复错误,未设置该变量。

这是我使用upserts重构的代码:

Song.objects(title=song.tag.title).update(path=path, upsert=True)
so = Song.objects.get(title=song.tag.title)
Album.objects(title=song.tag.album).update(add_to_set__songs=so, upsert=True)
al = Album.objects.get(title=song.tag.album)
Artist.objects(name=song.tag.artist).update(add_to_set__songs=so, add_to_set__albums=al, upsert=True)
ar = Artist.objects.get(name=song.tag.artist)
so.update(artist=ar, album=al)
al.update(artist=ar, add_to_set__songs=so)