Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回数组中的嵌套文档_Python_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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我认为这是独一无二的,但还是增加了答案,谢谢!