Mongoengine: динамические поля с EmbededDocuments в качестве значений
Я использовал MapField до сих пор как:
class Game(EmbeddedDocument):
iscomplete = BooleanField()
score = IntField()
#other not dynamic fields
class Progress(Document):
user = ReferenceField(User, dbref=True)
games = MapField(EmbeddedDocumentField(Game))
created_at = DateTimeField()
updated_on = DateTimeField()
Мне нужно конвертировать игры в ReferenceField.
Я хочу создать документ с динамическими полями / ключами, но в качестве значений встраиваемый документ, чтобы у меня был такой документ:
{
"game1": {
"iscomplete": true,
"score": 23,
},
"game2": {
"iscomplete": false,
"score": 10,
}
}
Неужели я все равно могу этого достичь?
1 ответ
Вы можете достичь этого, используя динамический документ в mongengine:
Документы DynamicDocument работают так же, как Document, но любые данные / атрибуты, установленные для них, также будут сохранены
Таким образом, вы удаляете игровое поле и позже добавляете свои динамические игровые поля как, поля game1, game2 и т. Д., Они будут сохранены.
class Game(EmbeddedDocument):
iscomplete = fields.BooleanField()
score = fields.IntField()
class Progress(DynamicDocument):
user = ReferenceField(User, dbref=True)
created_at = DateTimeField()
updated_on = DateTimeField()
p = Progress()
p.game1 = Game(iscomplete=True, score=10)
p.game2 = Game(iscomplete=False, score=5)
p.save()
[Примечание - используйте mongoengine и pandas для кода ниже]
Ниже приведен код для чтения файла csv и вставки в динамическую коллекцию mongod.
Пример -: для динамического сохранения данных csv в коллекции mongod.
import mongoengine as me
class DynamicDoc(me.DynamicDocument):
any_field = me.StringField()
import pandas as pd
all_csv_records = data_frame.to_dict('records')
data_frame = pd.read_csv(file_path)
for data in all_csv_records:
report_data = DynamicDoc()
DynamicDoc.any_field = str('temp_data')
for col, row in data.iteritems():
report_data[col] = row
report_data.save()