2016-05-26 4 views
3

Я следующий MongoEngine документMongoEngine удалить документ

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

Как delete этот документ с помощью MongoEngine?

Что я пробовал:

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 

- нота

Как ни странно, следующие работы прекрасно:

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

Но я следовал MongoEngine документы , и до сих пор не удается удалить только один конкретный ic document.

+0

Я думаю, [что примечание] (http://docs.mongoengine.org/guide/document-instances.html#deleting-documents) есть что-то делать с этим: 'Обратите внимание, что это будет работать только в том случае, если документ существует в базе данных и имеет действительный id.' – alecxe

+0

@alecxe mmm Я думал об этом, но отклонил его, потому что MongoEngine говорит, что' 'None 'не является допустимым ObjectId', 'some_id'' – Jivan

+0

Написал текущую теорию как ответ. У вас есть пользовательский первичный ключ/поле, определенное на модели? Благодарю. – alecxe

ответ

2

Если документ отменяет _id, вы должны указать, что она по-прежнему является первичным ключом. Измените определение класса документа из:

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

Чтобы задать первичный ключ:

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

Из того, что я понимаю, и в соответствии с note in the docs:

Обратите внимание, что это будет работать, только если документ существует в базе данных, и имеет действующий идентификатор

obj.delete() будет работать только тогда, когда ID объекта - obj.id - имеет действительное значение ObjectId. В вашем случае, вы не имеете obj.id определено, используйте синтаксис: objects.delete()

my_collection.MyCol.objects.delete() 
1

При цитировании mongoengine ObjecIds не используйте подчеркивание.

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

или

obj = my_collection.MyCol.objects(id='some_id') 
obj.delete() 
Смежные вопросы