2012-03-27 5 views
1

I definiert ein einfaches Dokument, wie folgt aus:Stringfield ist als eindeutig definiert, aber Duplikate gespeichert werden stillschweigend

class Company(Document): 
    screen_name = StringField(max_length=100, required=True, unique=True) 
    official_name = StringField(required=False) 

    meta = { 
     'indexes': [{'fields': 'screen_name', 'unique': True}] 
    } 

aber wenn ich einen Test schreibe

@use_tdb 
def test_company3(): 
    """ test company2 """ 
    company = Company(screen_name='asdasd') 
    company.save() 
    company = Company(screen_name='asdasd') 
    with nt.assert_raises(OperationError): 
     company.save() 
     pprint([(x.id, x.screen_name,) for x in Company.objects.all()]) 

Es spart tatsächlich von ihnen beide . Und ich sehe in der Ausgabe:

[(ObjectId('4f719f915c121a21ad000003'), u'asdasd'), 
(ObjectId('4f719f915c121a21ad000004'), u'asdasd')] 

Irgendwelche Ideen, was ich falsch gemacht habe?

Danke

Antwort

2

Das ist möglicherweise drop_collection erforderlich.

def test_company3(): 
    """ test company2 """ 
    Company.drop_collection() 
    company = Company(screen_name='asdasd') 
    company.save() 
    company = Company(screen_name='asdasd') 
    with nt.assert_raises(OperationError): 
     company.save() 
    pprint([(x.id, x.screen_name,) for x in Company.objects.all()]) 

Siehe diese Tests. Mongoengine ist alle Tests bestanden. https://github.com/hmarr/mongoengine/blob/master/tests/document.py#L875

Mongoengine Team Kürzlich relaeed 0.6.3.

+0

Danke, @Ankhaa, es funktioniert! Aber ich bin ein bisschen verwirrt. Bei jedem Test hatte ich bereits meinen use_tdb-Dekorator, der alle Sammlungen (außer 'system.indexes') vor und nach jedem Test löscht. Aber das hat nicht geholfen. Und selbst wenn ich die Testdb manuell von der Mongo-Shell löschte, blieb das Problem bestehen. Ich kann es nicht bekommen! db.dropDatabase() entfernt db nicht dauerhaft und beim nächsten Testlauf wählt mongodb alte Indizes aus? –

+0

Ja. Alte Indizes sind kompliziert und verwirrend. Hast du Mongoengine Tests gesehen? Der erste Befehl test start ist drop_collection. Das ist nur für Mongoengine und Mongodb verständlich. nicht in Produktion verwenden :). – Ankhaa

+0

Yup, hab es! Und ich habe eine andere Frage. Gibt es eine elegante Möglichkeit, Indizes für bereits vorhandene Auflistung (in der Entwicklungs- oder Produktions-DB) mit Ausnahme von QuerySet._reset_already_indexed (document = Company) neu zu erstellen? –