Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Dan AronneОтветов: 2

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

Я использую флягу, 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)

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

pythonflaskmongodbmongoengine

Ответы

Ответ 1 · рейтинг 1 · Ross

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

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

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

Ответ 2 · рейтинг 1 · tbicr

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы