Mongoengine文档在`switch_collection`之后没有字段保存

Mongoengine documents are saved without fields after `switch_collection`

在使用 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_createdTrue,也会发生同样的事情。

为什么会这样?这个例子有问题吗?

a_0.id归于a_1.id后,你应该用force_insert=True保存它,否则你只是在更新a_1