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)
失败了(但解释了我想做的比许多单词更好).
从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)
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |