是否可以使用MongoEngine删除字段,而不使用strict = False?

时间:2016-02-16 23:35:17

标签: mongodb mongoengine

我在MongoDB中获得了大量数据,我们主要通过MongoEngine访问,有时数据首先在字段F1中结束,然后我们后来确定字段F2是更好的地方,所以我们移动它在那边,并停止使用F1。

这很方便,但是现在我们在旧的F1键中得到了一堆过时的(或无用的)数据,并且正在使用空的F1键创建新文档,无缘无故。

虽然MongoDB很方便,但我仍然很欣赏strict=True功能(默认情况下已启用),并尝试避免将其关闭,除非绝对必要。我不喜欢关闭所有对集合的安全检查。

那么有没有办法从我的MongoDB集合中删除字段F1,没有停机时间,没有strict=False

  • 如果我首先从我的Document子类中删除该字段,MongoEngine会在尝试加载现有文档时抱怨。

  • 如果我首先从我的数据库中删除该字段,MongoEngine将为任何新记录创建该字段,直到模型更新为止。

有没有办法让MongoEngine说“这是一个旧字段。你可以加载它(或忽略它),如果它在那里,但是不要为任何新文件创建它”?

1 个答案:

答案 0 :(得分:1)

  

如果我首先从我的数据库中删除该字段,MongoEngine将为任何新记录创建该字段,直到模型更新为止

仅当您明确写入该字段或该字段设置了默认值时才会出现这种情况。否则,该字段在MongoDB中不存在。

因此,作为第一步,我建议删除写入该字段的代码并删除默认值(或将其设置为None)。然后从数据库中删除该字段是安全的。

以下小证明:

import mongoengine

class Foo(mongoengine.Document):
    a = mongoengine.IntField()
    b = mongoengine.ListField(default=None)

f = Foo().save()
type(f.a)  # NoneType
type(f.b)  # NoneType

数据库查询:

> db.foo.findOne()
{ "_id" : ObjectId("56c49ae8ee8b341b4ea02fcb") }