2016-05-26 6 views
3

Ich habe folgendes MongoEngine DokumentMongoEngine löschen Dokument

{ 
    '_id': 'some_id', 
    'data': 'some_data' 
} 

Wie kann ich delete dieses Dokument MongoEngine mit?

Was ich habe versucht:

import my_collection 

obj = my_collection.MyCol.objects.get(_id='some_id') 
# obj is correctly found - let's continue 

obj.delete() 
# mongoengine.errors.ValidationError: 'None' is not a valid ObjectId 

obj.delete('some_id') 
# TypeError: delete() takes 1 positional argument but 2 were given 

obj.delete(_id='some_id') 
# mongoengine.errors.ValidationError: 'None' is not a valid ObjectId 

- note

Seltsamer die folgenden funktioniert perfekt:

my_collection.MyCol.objects.delete() 
# delete all documents in the collection 

Aber ich habe MongoEngine docs gefolgt , und immer noch nicht schaffen, nur eine spezifische zu löschen ic Dokument.

+0

Ich denke, [dass Anmerkung] (http://docs.mongoengine.org/guide/document-instances.html#deleting-documents) hat etwas damit zu tun: 'Beachten Sie, dass dies nur funktioniert, wenn das Dokument in der Datenbank existiert und eine gültige ID hat. ' – alecxe

+0

@alecxe mmm Ich habe darüber nachgedacht, aber es wurde ignoriert, weil MongoEngine sagt,' Keine 'ist keine gültige ObjectId' - nicht' 'some_id'' – Jivan

+0

Posted eine aktuelle Theorie als Antwort. Haben Sie einen benutzerdefinierten Primärschlüssel/ein benutzerdefiniertes Feld im Modell definiert? Vielen Dank. – alecxe

Antwort

2

Wenn Ihr Dokument _id überschreibt, müssen Sie zeigen, dass es nach wie vor der Primärschlüssel ist. Ändern Sie Ihr Dokument Klassendefinition aus:

class MyCol(Document): 
    _id = db.StringField() 
    ... 

Um den Primärschlüssel angeben:

class MyCol(Document): 
    _id = db.StringField(primary_key=True) 
    ... 
2

Von dem, was ich verstehe, und nach dem note in the docs:

Beachten Sie, dass dies nur funktioniert, wenn das Dokument in der Datenbank vorhanden ist, und eine gültige ID

obj.delete() würde nur funktionieren, wenn die Objekt-ID - die obj.id Eigenschaft - hat einen gültigen ObjectId Wert. In Ihrem Fall müssen Sie nicht obj.id definiert, verwenden Sie die objects.delete() Syntax:

my_collection.MyCol.objects.delete() 
1

Wenn mongoengine ObjecIds verweisen Sie nicht den Unterstrich verwenden.

obj = my_collection.MyCol.objects.get(id='some_id') 

oder

obj = my_collection.MyCol.objects(id='some_id') 
obj.delete()