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()
Другие вопросы по тегам