Изменение типа поля в коллекции в базе данных mongodb

Тип поля в коллекции в моей базе данных mongodb — строка юникода. В настоящее время с этим полем не связаны никакие данные ни в одном из документов коллекции. Я не хочу, чтобы тип был строковым, потому что я хочу добавить к нему подполя из своего кода Python, используя pymongo.

В коллекции уже есть много записей. Итак, можно ли изменить тип поля на что-то вроде словаря в python для всех документов в коллекции?

Пожалуйста, помогите Спасибо


person James    schedule 22.07.2011    source источник


Ответы (2)


Конечно, просто создайте сценарий, который перебирает вашу текущую коллекцию, считывает существующее значение и перезаписывает его новым значением (в вашем случае это встроенный документ). Вы изменяете тип поля, просто устанавливая новое значение для этого поля. Например. установка строкового поля в целочисленное поле:

db.test.update({поле:"строка"}, {$set:{поле:23}})

person Remon van Vliet    schedule 22.07.2011

Я не уверен, что вы подразумеваете под "типом поля... является строкой" и "в этом поле... нет данных". Вы имеете в виду, что поле существует в ваших документах, но установлено в пустую строку или null?

В любом случае MongoDB «бессхемен», что означает, что он не будет применять какую-либо конкретную схему к вашим документам, даже если все документы в коллекции имеют одинаковую структуру.

Если вы используете фреймворк, который требует объявления схемы (MongoEngine, mongokit и т. д.), вам придется внести соответствующие изменения в использование фреймворка, и нам нужно будет знать, какой фреймворк вы используете. .

Если вы просто используете чистый pymongo, вы можете просто изменить свой документ по своему усмотрению. Предположим, у вас есть такой документ:

{name: "dcrosta", address: null }

И вы хотите сделать address поддокументом. Вы можете сделать все это в одном обновлении:

db.people.update({address: None}, {'$set': {'address': {
     'street1': None,
     'street2': None,
     'city': None,
     'state': None,
     'zip': None,
}}}, multi=True)

(это в pymongo, точный синтаксис будет немного отличаться в оболочке или в других драйверах)

person dcrosta    schedule 22.07.2011
comment
Спасибо за ответ. Поле говорит о метаданных, теперь, когда я делаю: s['metadata']['some_date'] = datetime.utcnow(), я получаю сообщение об ошибке: TypeError: объект 'unicode' не поддерживает назначение элементов. Поле some_date не существует, я создаю его с помощью моего кода Python и присваиваю ему datetime.utcnow(). - person James; 22.07.2011
comment
В Python вы должны заменить s['metadata'] на dict, прежде чем сможете присвоить ему значение. Документы MongoDB представлены в Python с родными типами данных Python — dict для документа, list для массивов, str/unicode, float, int/long и т. д. Попробуйте s['metadata'] = {}, а затем s['metadata']['sub_key'] = "sub_key's value" - person dcrosta; 22.07.2011