python - 如何查询数组以从键中检索值,MongoDB?
问题描述
假设我的 MongoDB 集合中有以下文档,我如何检索键的值,fixtures
以便如果我使用1
仅获取第一个对象的fixtures
限制并且如果我将其限制为2
它同时获取第一个文档和第二个文件中的一个。
我正在寻找的输出是一个管道,它从数组中返回键、值对,就像fixtures
以字典的形式一样。
#Example
collection.find({}, {'fixtures':1, '_id': 0}).limit(1)
>>>{'fixtures': [{'away_team': 'Arsenal',
'away_team_id': 1,
'away_team_score': 1,
'away_team_shortName': 'Arsenal',
'home_team': 'Newcastle United',
'home_team_id': 23,
'home_team_score': 0,
'home_team_shortName': 'Newcastle',
}]}
#The output I want
>>>{'away_team': 'Arsenal',
'away_team_id': 1,
'away_team_score': 1,
'away_team_shortName': 'Arsenal',
'home_team': 'Newcastle United',
'home_team_id': 23,
'home_team_score': 0,
'home_team_shortName': 'Newcastle',
}
如何使用find()
或存档aggregate()
。我知道,find({}, {'fixtures.KEY': 1})
但它返回以下难以使用的数据结构:
fixtures:[{KEY: value}]
{
"team": "Arsenal",
"team_id": 1,
"team_shortName": "Arsenal",
"competition": "Premier League",
"competition_abbr": "EN_PR",
"competition_id": 1,
"season_label": "2019/20",
"season_id": 274,
"fixtures": [
{
"home_team": "Brighton and Hove Albion",
"home_team_id": 131,
"home_team_shortName": "Brighton",
"home_team_score": 2,
"away_team": "Arsenal",
"away_team_id": 1,
"away_team_shortName": "Arsenal",
"away_team_score": 1,
},
{
"home_team": "Manchester City",
"home_team_id": 11,
"home_team_shortName": "Man City",
"home_team_score": 3,
"away_team": "Arsenal",
"away_team_id": 1,
"away_team_shortName": "Arsenal",
"away_team_score": 0,
}
]
},
{
"team": "Arsenal",
"team_id": 1,
"team_shortName": "Arsenal",
"competition": "Premier League",
"competition_abbr": "EN_PR",
"competition_id": 1,
"season_label": "2019/20",
"season_id": 274,
"fixtures": [
{
"home_team": "Arsenal",
"home_team_id": 1,
"home_team_shortName": "Arsenal",
"home_team_score": 3,
"away_team": "Everton",
"away_team_id": 7,
"away_team_shortName": "Everton",
"away_team_score": 2,
}
]
},
解决方案
您可以将聚合管道与$arrayElemAt
, 一起使用,语法如下
{ $arrayElemAt: [ <array>, <idx> ] }
连同$replaceRoot
, 将结果放在顶层
{ $replaceRoot: { newRoot: <replacementDocument> } }
collection.aggregate([{
$replaceRoot: { newRoot: { $arrayElemAt: ['$fixtures', 0] } } // get the first element as a top level document
}, {
$limit: 1 // to limit just 1 document, or omit the stage to get all documents
}])
推荐阅读
- html - 如何从伪类内部查找类
- azure-devops - 如何自定义功能板后面的查询
- node.js - 我在封闭函数中使用'io()'
- c# - 如何使用winforms为所有客户端停止exe
- html - T-SQL:如何仅替换 img 标记上 src='data:image/png;base64' 属性的内容
- grafana - 面板中的 grafana 变量
- python-3.x - 具有多个权重的 DEAP 算法
- angular - 为子组件启用candeactivate
- kubernetes - 无法推断为什么 JuPyterhub 的一个 imagePuller pod 失败,而其余三个则成功创建
- php - 使用 ajax 提交表单时,RouteCollection.php 第 251 行中的 MethodNotAllowedHttpException