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_created
是 True
,也会发生同样的事情。
为什么会这样?这个例子有问题吗?
将a_0.id
归于a_1.id
后,你应该用force_insert=True
保存它,否则你只是在更新a_1
。
在使用 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
,也会发生同样的事情。
为什么会这样?这个例子有问题吗?
将a_0.id
归于a_1.id
后,你应该用force_insert=True
保存它,否则你只是在更新a_1
。