Документ Mongoengine как EmbeddedDocument

У меня есть подкласс mongoengine.Document, определенный пользователем.

class User(Document):
    meta = {'collection': 'users', 'allow_inheritance': False}
    _id = ObjectIdField()
    password = StringField(max_length=50)
    name = StringField(max_length=50, required

теперь я хочу использовать его как отдельный документ с собственной коллекцией, но я также хочу использовать его как EmbeddedDocument как часть записи игры:

class Game(Document):
    meta = {'collection': 'games', 'allow_inheritance': False}
    _id = ObjectIdField()
    name = StringField()
    owner = EmbeddedField(User)

но существует проблема. Mongoengine позволяет встраивать только подклассы EmbeddedDocument. Есть ли способ решить эту проблему?


person yakxxx    schedule 08.06.2012    source источник


Ответы (2)


Попробуйте так:

class User(Document, EmbeddedDocument):
    ...
person Denis    schedule 08.06.2012

Разве вы не должны использовать ReferenceField?

В противном случае вы храните два несвязанных, но логически идентичных документа.

person Liam Dawson    schedule 20.06.2012
comment
Да, я знаю. Это запланированное поведение. - person yakxxx; 25.06.2012
comment
Я знаю, поздно воскресить простой вопрос, но это ответ. +1. Никогда не храните данные в двух разных местах (если только в этом нет крайней необходимости и вы уже понимаете все последствия). Очень легко расширить поле ссылки в коде приложения, и почти так же легко пропустить какой-то пограничный случай, забыть обновить другую копию вашего объекта и получить несоответствия. - person dokkaebi; 22.09.2012
comment
@dokkaebi Согласен с Вами на 100%. Я просто работал с некоторым устаревшим кодом/базой данных и должен был взаимодействовать с ним через mongoengine. Некоторые из наших сервисов обращались напрямую к базе данных. Я начал масштабный рефакторинг с взаимодействия Mongo с RESTfull API для управления схемой в одном месте. Следующим шагом было улучшение структуры БД, как вы говорите, но мы разделили процесс на несколько шагов, чтобы лучше тестировать/контролировать его. И первым шагом было переключение каждой зависимой службы на использование RESTfull API, а затем прозрачное изменение схемы БД :) - person yakxxx; 08.10.2012