【问题标题】:How to query array to retrieve value from key, MongoDB?如何查询数组以从键中检索值,MongoDB?
【发布时间】:2020-06-24 18:39:32
【问题描述】:

假设我的 MongoDB 集合中有以下文档,我如何检索 fixtures 中键的值,这样如果我使用 1 的限制,则只能获取 fixtures 中的第一个对象,如果我将其限制为2,它会同时出现在第一个文档和第二个文档中。

我正在寻找的输出是一个管道,它从数组中返回键、值对,例如以 dict 的形式返回 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,
            }
        ]
    },

【问题讨论】:

  • 我仍然不太清楚输出应该是什么样子,您能否也包括一个示例输出?
  • @thammada.ts 谢谢你的意见,现在清楚了吗?
  • 那么您希望数组字段fixtures 的第一个元素作为结果的根文档吗?或者数组索引 X 处的元素,您可以在其中指定 X?
  • @thammada.ts 很抱歉造成混乱,我更新了预期输出以进行澄清

标签: python mongodb mongodb-query aggregation-framework


【解决方案1】:

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

【讨论】:

  • 感谢您的耐心等待,这正是我想要的!如果您不介意我问,在使用此聚合时,是否可以同时选择顶级键说 season_label
  • 您必须先使用$mergeObjects 才能将$arrayElemAt 的结果与具有所需键的对象合并
  • 我明白了,感谢您提供宝贵的见解并抽出宝贵时间!
  • 欢迎询问您是否尝试过$mergeObjects 并仍需要帮助
  • 我尝试了以下{"$mergeObjects":[{"$match" : { "season_label" : "$season_label" }}, {Your aggregation $replaceRoot...}, {"$limit": 2}]。我得到的回复是$mergeObjects is not allowed in this atlas tier
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多