2016-12-04 140 views
1

伙计!使用MongoEngine的复杂的MongoDB查询

我正在尝试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>" 
        }] 
       }] 
      }] 
}] 

是否有可能接收响应这样的只有一个查询?

回答

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]