2016-12-04 2 views
1

Jungs!Komplexe MongoDB Abfrage mit MongoEngine

Ich versuche MongoDB (Version 3.2) und MongoEngine und möchte komplexe Abfrage machen, aber völlig verloren, wie könnte ich es machen. Wenn es überhaupt möglich ist.

Es gibt 4 Dokumente:

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

Ich muss Abfrage machen, die Reaktion der folgenden Form zurück:

[{ 
    "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>" 
        }] 
       }] 
      }] 
}] 

Ist es möglich, mit nur einer Abfrage Antwort wie die erhalten?

Antwort

0

Das ist richtig Abfrage Antwort wie folgt zu erhalten:

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]