【问题标题】:Mongoengine documents are saved without fields after `switch_collection`Mongoengine 文档在 `switch_collection` 后保存为无字段
【发布时间】:2020-03-05 04:22:42
【问题描述】:

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

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

【问题讨论】:

    标签: python mongodb pymongo mongoengine


    【解决方案1】:

    a_0.id 归属于a_1.id 后,应将其保存为force_insert=True,否则您只是在更新a_1

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 2020-09-24
      • 2016-10-31
      • 2012-05-30
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      相关资源
      最近更新 更多