2016-02-16 29 views
1

我在MongoDB中有很多数据,我们主要通过MongoEngine访问数据,有时数据首先在字段F1中结束,然后我们后来决定字段F2是一个更好的地方,所以我们将它移到在那里,并停止使用F1。是否有可能使用MongoEngine删除一个字段,而不是strict = False?

这很方便,但现在我们在旧的F1按键中有一堆陈旧的(或无用的)数据,并且没有任何理由用空的F1按键创建新文档。

尽管MongoDB无模式很方便,但我还是很欣赏strict=True功能(默认情况下),并尽量避免关闭,除非绝对必要。我不喜欢关闭全部集合上的安全检查。

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

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

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

是否与MongoEngine任何方式说:“这是一个古老的领域。你可以加载(或忽略它),如果它的存在,但没有任何新的文件创建”?

+0

所以你基本上是问。 *“数据是否严格符合我们严格的模式?”*。 MongoDB本身是无模式的,被设计为不关心。一旦你开始使用一个关心的软件层,那么你就必须遵守这些规则。所以你的选择似乎是A.使模式规则不关心不符合的数据。 B.改变数据以适应模式规则。这是一个很好的二进制解决方案集。 –

+0

因此,如果您想要进行更改,那么请使用“原始”方法来进行操作,而不要求它符合架构。所有模式对象都有一个'.collection'访问器,它提供对核心驱动程序的底层集合对象和方法的访问。 –

+0

首先,我的问题是关于MongoEngine,而不是MongoDB。显然,如果我完全从窗口中放出模式,那么很容易。这从来没有问题。其次,您使用“原始”方法的建议听起来像是我第二个要点的特定变体。感谢您的帮助,但我知道如何做到这一点。问题是(取决于配置和顺序)MongoEngine拒绝加载这些记录,或者将过时的字段添加到它创建的任何新文档中,这会破坏整个目的。 –

回答

1

如果我从我的数据库首先删除领域,MongoEngine将创建任何新记录,直到更新模型

如果明确写入该场它是唯一真正的或该字段有一个默认值集。否则,该字段将不存在于MongoDB中。

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

下面一个小的证明:

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") } 
+0

“只有在您明确写入该字段或该字段设置了默认值时才是如此。”经验上说,这不是我的电脑上发生的事情。您使用的是哪个版本的MongoEngine? –

+0

我正在使用'mongoengine == 0.10.0' – matino

+0

也用'mongoengine == 0.10.6'测试了相同的结果 – matino

相关问题