Документы Mongoengine сохраняются без полей после `switch_collection` - PullRequest
0 голосов
/ 08 ноября 2019

У меня очень странное поведение при сохранении документов после использования метода switch_collection.

Можно воспроизвести с помощью следующего кода:

import mongoengine as me


class ObjectA(me.Document):
    name = me.StringField()


def test_strange_behaviour():
    a_0 = ObjectA(name="a_0")
    a_0.save()

    a_1 = ObjectA(name="a_1")
    a_1.save()

    a_1.switch_collection("new_collection", keep_created=False)
    a_1.id = a_0.id
    a_1.save()

    print(a_1._collection)
    print(a_1._collection.find_one(a_1.id))

При вызове функции test_strange_behaviour код печатает что-то вроде этого:

Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary(), connecttimeoutms=30000, heartbeatfrequencyms=3000, ssl=False), 'engine'), 'new_collection')
{'_id': ObjectId('5dc57611dba04ca06410e477')}

Как вы можетеПосмотрите, последняя печать показывает, что документ, созданный в коллекции new_collection, содержит только поле _id, а не поле name. То же самое происходит, если keep_created равно True.

Почему это происходит? Что-то не так с этим примером?

1 Ответ

1 голос
/ 08 ноября 2019

После присвоения a_0.id значению a_1.id вы должны сохранить его с force_insert=True, в противном случае вы просто обновляете a_1.

...