访问数组中嵌入文档中的值

Jér*_*ôme 5 mongodb pymongo aggregation-framework

考虑一个包含嵌入文档数组的文档:

{'array': [{'key1': 120.0, 'key2': 69.0}, {'key1': 100.0, 'key2': 50.0}]}
Run Code Online (Sandbox Code Playgroud)

我想投影key2数组的第一个元素.

我天真地试过

'$project':
    {
        'item': '$array.0.key2'
    }
Run Code Online (Sandbox Code Playgroud)

失败了(但解释了我想做的比许多单词更好).

使用$ arrayElemAt和$ let

从MongoDB 3.2开始,可以使用$ arrayElemAt从列表中获取项目:

'$project':
    {
        'item1': {'$arrayElemAt': ['$array', 0] }
    }
Run Code Online (Sandbox Code Playgroud)

将返回item1{'key1': 120.0, 'key2': 69.0}.

我想要的key2是什么.

我设法使用$ let得到它:

'$project':
    {
        'item': {
            '$let': {
                'vars': {
                    'tmp': {'$arrayElemAt': ['$array', 0] },
                    },
                'in': '$$tmp.key2'
            }
        },
    }
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?

这看起来很痛苦.特别是考虑到我想在同一个投影中使用这种结构在几个表达式中使用相同的值(测试不为零,然后在除法中使用).

 上下文

该数组存储文档中表示的对象的连续状态,按日期,逆序排序.数组的第一个元素是最后一个(因此是当前的)状态.我想使用当前状态中两个值的比率对文档进行排序.

有可能唯一合理的解决方案是将最后一个状态从数组中取出.或者甚至预先计算比率并对预先计算的值进行排序.

小智 2

在聚合管道中,您可以重复以下步骤以使事情保持干净:

'$project': {'item1': {'$arrayElemAt': ['$array', 0] }}
Run Code Online (Sandbox Code Playgroud)

你可以加:

{$project: {"item1.key2": 1}}
Run Code Online (Sandbox Code Playgroud)