Python 使用MongoEngine的复杂MongoDB查询
伙计们 我正在尝试MongoDB(3.2版)和MongoEngine,希望进行复杂的查询,但完全不知道如何进行查询。如果可能的话 共有4份文件: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
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]