2016-02-16 2 views
1

У меня есть много данных в MongoDB, к которым мы обращаемся в основном через MongoEngine, а иногда данные сначала попадали в поле F1, а потом мы решили, что поле F2 лучше для него, поэтому мы переместили его там, и остановился, используя F1.Можно ли удалить поле с помощью MongoEngine, без строгих = False?

Это удобно, но теперь у нас есть куча устаревших (или бесполезных) данных в старых клавишах F1, а новые документы создаются с пустыми клавишами F1, без всякой причины.

Хотя MongoDB является схематичным, я по-прежнему ценю функцию strict=True (которая включена по умолчанию), и старайтесь не отключать ее, кроме случаев, когда это абсолютно необходимо. Мне не нравится отключать все проверки безопасности на коллекции.

Итак, есть ли способ удалить поле F1 из моей коллекции MongoDB без простоя и без strict=False?

  • Если я сначала удалю поле из своего подкласса Document, MongoEngine будет жаловаться, когда он попытается загрузить существующие документы.

  • Если я сначала удалю поле из своей базы данных, MongoEngine создаст его для любых новых записей, пока модель не будет обновлена.

Есть ли способ, с MongoEngine сказать: «Это старое поле. Вы можете загрузить его (или игнорировать его), если она есть, но не создают его для каких-либо новых документов»?

+0

Так вы в основном просят. * «Можно ли иметь данные, которые строго не соответствуют нашей строгой схеме?» *. Сам MongoDB является схематичным и предназначен не для того, чтобы заботиться. После того, как вы начнете использовать программный уровень, который действительно заботится, вы привязаны к этим правилам. Таким образом, ваш выбор здесь, похоже, равен A. Заставьте правила схемы не заботиться о несоответствующих данных. B. Измените данные в соответствии с правилами схемы. Это довольно набор бинарных решений. –

+0

Следовательно, если вы хотите внести изменения, тогда вместо этого используйте «сырые» методы, чтобы сделать манипуляцию таким образом, чтобы не просить ее соответствовать схеме. Все объекты схемы имеют аксессуар '.collection', который обеспечивает доступ к основному объекту коллекции и методам из основного драйвера. –

+0

Во-первых, мой вопрос касается MongoEngine, а не MongoDB. Ясно, что если я полностью выкидываю схемы из окна, то это легко. Это никогда не обсуждалось. Во-вторых, ваше предложение использовать «необработанные» методы «похоже на конкретный вариант моего второго пункта. Спасибо за попытку помочь, но я знаю, как это сделать.Проблема в том, что (в зависимости от конфигурации и заказа) либо MongoEngine отказывается загружать эти записи, либо добавляет устаревшие поля к любым новым документам, которые он создает, что наносит ущерб всей цели. –

ответ

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

«Это верно только в том случае, если вы явно пишете в это поле или если в поле установлено значение по умолчанию». Эмпирически это не то, что происходит на моем компьютере. Какую версию MongoEngine вы используете? –

+0

Я использую 'mongoengine == 0.10.0' – matino

+0

Также тестировался с' mongoengine == 0.10.6' с тем же результатом – matino