Как вы можете получить последние объекты 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)


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

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

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

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

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

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

person tbicr    schedule 10.04.2013