Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用MongoEngine的复杂MongoDB查询_Python_Mongodb_Mongoengine - Fatal编程技术网

Python 使用MongoEngine的复杂MongoDB查询

Python 使用MongoEngine的复杂MongoDB查询,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,伙计们 我正在尝试MongoDB(3.2版)和MongoEngine,希望进行复杂的查询,但完全不知道如何进行查询。如果可能的话 共有4份文件: class File(EmbeddedDocument): path = StringField() class Episode(EmbeddedDocument): num = IntField() alias = StringField() files = EmbeddedDocumentListField('Fi

伙计们

我正在尝试MongoDB(3.2版)和MongoEngine,希望进行复杂的查询,但完全不知道如何进行查询。如果可能的话

共有4份文件:

class File(EmbeddedDocument):
    path = StringField()

class Episode(EmbeddedDocument):
    num = IntField()
    alias = StringField()
    files = EmbeddedDocumentListField('File')

class Season(Document):
    num = IntField()
    alias = StringField()
    episodes = EmbeddedDocumentListField('Episode', db_field='items')

class Series(Document):
    title = StringField()
    alias = StringField()
    description = StringField()
    seasons = ListField(ReferenceField('Season'), db_field='items')
我需要进行查询,以返回以下形式的响应:

[{
   "path": "/series/<series alias>",
   "title": "<series title>",
   "description": "<series description>",
   "seasons": [{
                "path": "/series/<aseries alias>/<season alias>",
                "title": "Season <season num>",
                "episodes": [{
                    "path": "/series/<series alias>/<season alias>/<episode alias>",
                    "title": "Episode <episode num>",
                    "files": [{
                        "path": "<path>"
                    }]
                }]
             }]
}]
[{
“路径”:“/系列/”,
“名称”:“名称”,
“说明”:“,
“季节”:[{
“路径”:“/系列/”,
“标题”:“季节”,
“情节”:[{
“路径”:“/系列//”,
“标题”:“插曲”,
“文件”:[{
“路径”:”
}]
}]
}]
}]

只有一个查询就可以收到这样的响应吗?

这是一个正确的查询,可以得到这样的响应:

cursor = Series.objects.all().aggregate(
        {'$unwind': '$items'},
        {'$lookup': {
            'from': 'products',
            'localField': 'items',
            'foreignField': '_id',
            'as': 'seasons'
        }},
        {'$project': {
            'path': {'$concat': ['/series/', '$alias']},
            'title': '$title',
            'description': '$description',
            'seasons': {
                '$map': {
                    'input': '$seasons',
                    'as': 'season',
                    'in': {
                        'path': {'$concat': ['/series/', '$alias', '/', '$$season.alias']},
                        'title': {'$concat': ['Season ', {'$substr': ['$$season.num', 0, -1]}]},
                        'episodes': {
                            '$map': {
                                'input': '$$season.items',
                                'as': 'episode',
                                'in': {
                                    'path': {'$concat': ['/series/', '$alias', '/', '$$season.alias', '/', '$$episode.alias']},
                                    'title': {'$concat': ['Episode ', {'$substr': ['$$episode.num', 0, -1]}]},
                                    'files': {
                                        '$map': {
                                            'input': '$$episode.files',
                                            'as': 'files',
                                            'in': {
                                                'path': '$$files.path'
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }})
res = list(cursor)[0]

这是获得如下响应的正确查询:

cursor = Series.objects.all().aggregate(
        {'$unwind': '$items'},
        {'$lookup': {
            'from': 'products',
            'localField': 'items',
            'foreignField': '_id',
            'as': 'seasons'
        }},
        {'$project': {
            'path': {'$concat': ['/series/', '$alias']},
            'title': '$title',
            'description': '$description',
            'seasons': {
                '$map': {
                    'input': '$seasons',
                    'as': 'season',
                    'in': {
                        'path': {'$concat': ['/series/', '$alias', '/', '$$season.alias']},
                        'title': {'$concat': ['Season ', {'$substr': ['$$season.num', 0, -1]}]},
                        'episodes': {
                            '$map': {
                                'input': '$$season.items',
                                'as': 'episode',
                                'in': {
                                    'path': {'$concat': ['/series/', '$alias', '/', '$$season.alias', '/', '$$episode.alias']},
                                    'title': {'$concat': ['Episode ', {'$substr': ['$$episode.num', 0, -1]}]},
                                    'files': {
                                        '$map': {
                                            'input': '$$episode.files',
                                            'as': 'files',
                                            'in': {
                                                'path': '$$files.path'
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }})
res = list(cursor)[0]