0

How I can get all messages from Theme with id = 1 in Section with _id = 4ef1fddbb33c45091d000000?

I have some model:

class Message(EmbeddedDocument):
    id = SequenceField(unique=True)
    content = StringField()
    create_date = DateTimeField()
    user = StringField()
    active = BooleanField()

class Theme(EmbeddedDocument):
    id = SequenceField(unique=True)
    title = StringField()
    content = StringField()
    create_date = DateTimeField()
    user = StringField()
    messages = ListField(EmbeddedDocumentField(Message))
    active = BooleanField()

class Section(Document):
    title = StringField(unique=True)
    description = StringField()
    themes = ListField(EmbeddedDocumentField(Theme))

And this model generate some JSON, like this:

{
    "_cls": "Section",
    "_id": {
        "$oid": "4ef1fddbb33c45091d000000"
    },
    "_types": [
        "Section"
    ],
    "description": "Test description",
    "themes": [
        {
            "_types": [
                "Theme"
            ],
            "title": "Test",
            "messages": [
                {
                    "content": "I'm content!",
                    "_types": [
                        "Message"
                    ],
                    "id": 12,
                    "_cls": "Message"
                },
                {
                    "content": "I'm second message!",
                    "_types": [
                        "Message"
                    ],
                    "_cls": "Message",
                    "user": "inlanger",
                    "id": 13
                }
            ],
            "content": "Test description",
            "_cls": "Theme",
            "id": 1
        },
        {
            "_types": [
                "Theme"
            ],
            "title": "Test2",
            "messages": [
                {
                    "_types": [
                        "Message"
                    ],
                    "create_date": {
                        "$date": "2012-01-31T11:29:17.120Z"
                    },
                    "content": "Some message",
                    "_cls": "Message",
                    "id": 14,
                    "user": "inlanger"
                }
            ],
            "content": "Test description 2",
            "_cls": "Theme",
            "id": 2
        },
        {
            "_types": [
                "Theme"
            ],
            "create_date": {
                "$date": "2012-01-31T12:00:50.889Z"
            },
            "title": "Ататата",
            "messages": [],
            "content": "Theme number 3",
            "user": "inlanger",
            "id": 15,
            "_cls": "Theme"
        }
    ],
    "title": "Test"
}

I use some code... It work's, but it's ugly:

def get_theme_messages(section_id, theme_id, page = 1):
    section = Section.objects(id = section_id, themes__id = theme_id).first()
    for theme in section.themes:
        if theme.id == int(theme_id):
            return theme.messages
            break
        else:
            pass
4

1 回答 1

3

MongoDB 总是返回完整的文档(即Document实例,用 Mongoengine 的说法)。如果要过滤EmbeddedDocuments 中的列表中的列表Document,则必须在客户端代码中进行(如您在此处所示)。

您可以通过删除一些不必要的行来稍微清理一下这段代码:

def get_theme_messages(section_id, theme_id, page = 1):
    section = Section.objects(id = section_id, themes__id = theme_id).first()
    for theme in section.themes:
        if theme.id == int(theme_id):
            return theme.messages

(这在功能上等同于您在上面粘贴的内容)

于 2012-01-31T17:56:20.327 回答