0

_id = 4ef1fddbb33c45091d000000のセクションで、id = 1のテーマからすべてのメッセージを取得するにはどうすればよいですか?

私はいくつかのモデルを持っています:

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))

そして、このモデルは次のようなJSONを生成します。

{
    "_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"
}

私はいくつかのコードを使用しています...それは動作しますが、醜いです:

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の用語ではインスタンス)。EmbeddedDocument内のリスト内ののリストをフィルタリングする場合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 に答える