Python 如何返回数组中的嵌套文档
我有以下模式的文档:Python 如何返回数组中的嵌套文档,python,mongodb,mongodb-query,aggregation-framework,Python,Mongodb,Mongodb Query,Aggregation Framework,我有以下模式的文档: { "user_id": 123, "services":[ {"name": "test", "data": ... }, {"name": "test1", "data": ... }, {"name": "test2", "data": ... } ] } {"name": "
{
"user_id": 123,
"services":[
{"name": "test",
"data": ...
},
{"name": "test1",
"data": ...
},
{"name": "test2",
"data": ...
}
]
}
{"name": "test2",
"data": ...
}
我正在尝试按名称获取特定用户的服务,\u id,返回如下:
{
"user_id": 123,
"services":[
{"name": "test",
"data": ...
},
{"name": "test1",
"data": ...
},
{"name": "test2",
"data": ...
}
]
}
{"name": "test2",
"data": ...
}
我很难理解如何做到这一点,似乎像这样简单的事情不需要聚合,但也许我错了。我确信投影可以在find\u one
语句中工作,但我不确定使用什么。顺便说一句,我不确定这是否有帮助
我试过:
async def get_service_by_name(user_id, name):
return await db.guilds.find_one({
'user_id': 123,
'services': {'$elemMatch': {'name': "test"}}},
{'user_id: 0, 'services.$': 1}))
但这也带来了:
{"services":[{"name" : "test", "data" : "blah" }]}
这很好,因为它接近我想要的,我需要做的就是:
service = await get_service_by_name(123, "test")
service = service['service'][0]
但是,有没有一种方法可以将数据作为服务返回,而无需聚合?如果不是,那么聚合应该是什么样子
编辑
我提出了一个聚合,可以做到这一点,但我想确保没有更好的方法:
await db.guilds.aggregate([
{'$unwind': '$services'},
{'$match':{
'_id': 123,
'services.name': "test"}},
{'$project': {
'_id': 0,
'name': '$services.name',
'data': '$services.data'}}
])
您需要运行以从服务
获取单个文档,并将其升级到根级别:
db.guilds.aggregate([
{
$match: { user_id: 123, "services.name": "test" }
},
{
$unwind: "$services"
},
{
$match: { "services.name": "test" }
},
{
$replaceRoot: { newRoot: "$services" }
}
])
哦,哇,我也想出了我自己的,看我的编辑。我更喜欢这种方式。虽然就性能而言,你和我的哪个更好?(我倾向于你的观点,尽管问起来没什么坏处)另外,这两个匹配语句是否可以合并到你的语句中,使之成为像我一样的一个?我不太擅长聚合,你越早过滤掉所有文档越好。因此,在第一次
$match
之后,应该只有一个文档,而在聚合中,您$unwind所有文档,然后运行筛选-这应该在性能方面有所不同ah,我明白了。谢谢@Fanpark我认为这是独一无二的,但还是增加了答案,谢谢!