python-如何在数组中返回嵌套文档
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何在数组中返回嵌套文档,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1358字,纯文字阅读大概需要2分钟。
内容图文
![python-如何在数组中返回嵌套文档](/upload/InfoBanner/zyjiaocheng/690/d69ff3e668b04fb9ad05284ec22c387b.jpg)
我有如下架构的文档:
{
"user_id": 123,
"services":[
{"name": "test",
"data": ...
},
{"name": "test1",
"data": ...
},
{"name": "test2",
"data": ...
}
]
}
我正在尝试通过名称获取返回的特定user_id的服务,如下所示:
{"name": "test2",
"data": ...
}
我很难理解如何做到这一点,并且似乎不需要像这样简单的事情进行汇总,但是也许我错了.我确定投影可以在find_one语句中使用,但不确定使用什么.我正在使用Motor btw,不确定是否有帮助.
我努力了:
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'}}
])
解决方法:
您需要运行$unwind以从服务中获取单个文档,并需要运行$replaceRoot以将其提升到根级别:
db.guilds.aggregate([
{
$match: { user_id: 123, "services.name": "test" }
},
{
$unwind: "$services"
},
{
$match: { "services.name": "test" }
},
{
$replaceRoot: { newRoot: "$services" }
}
])
内容总结
以上是互联网集市为您收集整理的python-如何在数组中返回嵌套文档全部内容,希望文章能够帮你解决python-如何在数组中返回嵌套文档所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。