我在MongoDB中获得了大量数据,我们主要通过MongoEngine访问,有时数据首先在字段F1中结束,然后我们后来确定字段F2是更好的地方,所以我们移动它在那边,并停止使用F1。
这很方便,但是现在我们在旧的F1键中得到了一堆过时的(或无用的)数据,并且正在使用空的F1键创建新文档,无缘无故。
虽然MongoDB很方便,但我仍然很欣赏strict=True
功能(默认情况下已启用),并尝试避免将其关闭,除非绝对必要。我不喜欢关闭所有对集合的安全检查。
那么有没有办法从我的MongoDB集合中删除字段F1,没有停机时间,没有strict=False
?
如果我首先从我的Document子类中删除该字段,MongoEngine会在尝试加载现有文档时抱怨。
如果我首先从我的数据库中删除该字段,MongoEngine将为任何新记录创建该字段,直到模型更新为止。
有没有办法让MongoEngine说“这是一个旧字段。你可以加载它(或忽略它),如果它在那里,但是不要为任何新文件创建它”?
答案 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") }