首页 > 解决方案 > 如何查询数组以从键中检索值,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,
            }
        ]
    },

标签: pythonmongodbmongodb-queryaggregation-framework

解决方案


您可以将聚合管道与$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
}])

推荐阅读