Как вы можете получить последние объекты EmbeddedDocument с помощью MongoEngine

Я пытаюсь сделать запрос, чтобы получить последние комментарии, которые были отправлены к любому сообщению, но не могу сделать это правильно. Я в основном хочу показать список действий всех комментариев, размещенных на веб-сайте.

Я использую флягу, mongodb с mongo-engine.

Вот мои модели:

class Post(db.Document):
    slug = db.StringField(max_length=255, required=True)
    title = db.StringField(max_length=255, required=True)
    body = db.StringField(max_length=255, required=True)
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))

class Comment(db.EmbeddedDocument):
    message = db.StringField(required=True)
    author = db.ReferenceField(User, dbref=True)
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)

Любые идеи были бы хорошы. Ваше здоровье


person Dan Aronne    schedule 10.04.2013    source источник


Ответы (2)


arrow_upward
1
arrow_downward

Дизайн схемы для этого конкретного варианта использования оставляет желать лучшего. Вы должны хранить комментарии как отдельный документ, а затем вы можете запрашивать данные так, как вам нужно эффективно.

В качестве альтернативы вы можете денормализовать и хранить последние x комментариев в отдельном документе/коллекции. Однако вам придется вручную управлять этой коллекцией.

В документации mongodb есть хороший раздел по моделированию данных, который может оказаться полезным.

person Ross    schedule 10.04.2013
comment
Возможно, это плохая схема, но документы и демонстрации Flask Mongoengine в Интернете используют что-то очень похожее. К тому же вы не отвечаете на вопрос. - person jowan sebastian; 04.12.2015
comment
Я думал, что мое второе предложение ответило на вопрос - в основном хранить комментарии в своей собственной коллекции. Это означает, что вы можете эффективно запрашивать комментарии. Я даже предложил другую идею, используя эту схему, но добавив еще одну коллекцию последних комментариев. Предлагаю два варианта решения проблемы. - person Ross; 07.12.2015

arrow_upward
1
arrow_downward

EmbeddedDocumentField означает, что этот документ является частью собственного документа, такого как словарь. Таким образом, вы можете получить все сообщения со всеми комментариями, затем вы можете получить все комментарии и отсортировать их. Или вы можете сделать comments списком ReferenceField и Comment списком Documetn. Или вы можете написать собственную функцию монго, которая сделает это.

Возможно, pymongo позволяет получить часть списка, но я не знаю, как это сделать. Однако, насколько я знаю, mongoengoe не позволяет это делать.

person tbicr    schedule 10.04.2013