Форум сайта python.su
Здравствуйте.
Только начал изучать mongodb, и возник вопрос.
как например там создать схемы Post и Tags?
допустим есть что-то такое:
class Tag(Document):
structure = {
'name': unicode,
'is_enabled': bool,
}
required_fields = ['name']
default_values = {
'is_enabled': False
}
class Post(Document):
structure = {
'title': unicode,
'body': unicode,
'author': unicode,
'date_creation': datetime.datetime,
'tags': [], # Tag's array
}
required_fields = ['title', 'author', 'date_creation']
default_values = {
'date_creation': datetime.datetime.now
}
tags: [ObjectId('4e16e5f3daf6d5077e000000'), ObjectId('4e1aa33cdaf6d52128000000')]
tags: [{u'_id': ObjectId('4e16e5f3daf6d5077e000000'),
u'is_enabled': True,
u'name': u'python'},
{u'_id': ObjectId('4e1aa33cdaf6d52128000000'),
u'is_enabled': False,
u'name': u'nosql'}]
tags: [DBRef(u'tags', ObjectId('4e16e5f3daf6d5077e000000')),
DBRef(u'tags', ObjectId('4e1aa33cdaf6d52128000000'))]
Офлайн
Как я понял задача в этом:
LestatChebОно не пересекается с задачей “как хранить теги в посте”.
у всех тегов есть параметр is_enabled, который редактирует Модератор, указывая что данный тег будет во всплывающей подсказке при добавлении новых постов.
tags: [ 'sql', 'python', 'linux' ]
Отредактировано (Июль 11, 2011 13:53:18)
Офлайн
LestatChebДа, будет меньше. Для каждого поста будет выполнятся запрос на список тегов (derefference).
в случае с DBRef скорость будет ведь меньше чем embedded documents?
LestatChebВообще в документации пишут что в случае с отношениями один-ко-многим (если перенести все на реляционную модель) стоит делать embedded документы.
т.е. для максимальной скорости только 2) вариант годится? + тогда получается нужно как-то отдельно обновлять все посты, при изменении галочки is_enabled в коллекции tags
class Post(Document):
structure = {
'title': unicode,
'body': unicode,
'author': unicode,
'date_creation': datetime.datetime,
'tags': [Tag], # Tag's array
}
required_fields = ['title', 'author', 'date_creation']
default_values = {
'date_creation': datetime.datetime.now
}
Офлайн
o7412369815963хм, пожалуй да, так и сделаю.
Храните, например, массивом:а теги будут храниться в отдельной, своей коллекции “tags”, там и будет параметр is_enabledtags: [ 'sql', 'python', 'linux' ]
Sleepwalkerа как в структуре лучше описывать что это массив именно Tag, а не скажем User или еще кого-то?'tags': [Tag], # Tag's array
'tags': [Tag], # Tag's array
'tags': [], # Tag's array
Офлайн
Монго получает json который нужно сохранить. Разница тут на уровне MongoKit.
В случае с "'tags': “ вы сможете записать в атрибут обьекта Post только список из обьектов Tag, иначе MongoKit вызовет ошибку валидации.
А при ”'tags': “ вы сможете что угодно писать в post.tags.
Ну и соответственно когда Вы достанете обьект Post из базы - то в tags будет либо список обьектов Tag (”tags': "), либо чего угодно (диктов, строк или чего Вы там запишете).
Отредактировано (Июль 11, 2011 16:02:08)
Офлайн
Sleepwalkerо, супер!
В случае с "'tags': " вы сможете записать в атрибут обьекта Post только список из обьектов Tag, иначе MongoKit вызовет ошибку валидации.
Офлайн