我在MongoDB中有很多数据,我们主要通过MongoEngine访问数据,有时数据首先在字段F1中结束,然后我们后来决定字段F2是一个更好的地方,所以我们将它移到在那里,并停止使用F1。是否有可能使用MongoEngine删除一个字段,而不是strict = False?
这很方便,但现在我们在旧的F1按键中有一堆陈旧的(或无用的)数据,并且没有任何理由用空的F1按键创建新文档。
尽管MongoDB无模式很方便,但我还是很欣赏strict=True
功能(默认情况下),并尽量避免关闭,除非绝对必要。我不喜欢关闭全部集合上的安全检查。
那么有什么办法可以从我的MongoDB集合中删除一个字段F1,没有停机时间,也没有strict=False
?
如果我先从我的Document子类中删除该字段,MongoEngine会在尝试加载现有文档时发出抱怨。
如果我先从我的数据库中删除该字段,MongoEngine会为任何新记录创建它,直到模型更新。
是否与MongoEngine任何方式说:“这是一个古老的领域。你可以加载(或忽略它),如果它的存在,但没有任何新的文件创建”?
所以你基本上是问。 *“数据是否严格符合我们严格的模式?”*。 MongoDB本身是无模式的,被设计为不关心。一旦你开始使用一个关心的软件层,那么你就必须遵守这些规则。所以你的选择似乎是A.使模式规则不关心不符合的数据。 B.改变数据以适应模式规则。这是一个很好的二进制解决方案集。 –
因此,如果您想要进行更改,那么请使用“原始”方法来进行操作,而不要求它符合架构。所有模式对象都有一个'.collection'访问器,它提供对核心驱动程序的底层集合对象和方法的访问。 –
首先,我的问题是关于MongoEngine,而不是MongoDB。显然,如果我完全从窗口中放出模式,那么很容易。这从来没有问题。其次,您使用“原始”方法的建议听起来像是我第二个要点的特定变体。感谢您的帮助,但我知道如何做到这一点。问题是(取决于配置和顺序)MongoEngine拒绝加载这些记录,或者将过时的字段添加到它创建的任何新文档中,这会破坏整个目的。 –