首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDB中聚合数组(2)

在MongoDB中聚合数组(2)
EN

Stack Overflow用户
提问于 2018-08-02 21:00:16
回答 2查看 36关注 0票数 0

我有一个结构如下的数据库:

代码语言:javascript
复制
 {
                "teams" : [
                    {
                        "best_players" : [
                            {
                                "contact" : {
                                    "name" : "SomeName1"
                                }, 
                                "characteristic" : {
                                    "skills" : "good"
                                 }
                                },
                                {
                                "contact" : {
                                    "name" : "SomeName2"
                                }, 
                                "characteristic" : {
                                    "skills" : "good"
                                 }
                                }

                        ], 
                        "teamname" : "SomeTeam1"
                    }, 
                    {
                    "best_players" : [
                        {
                            "contact" : {
                                "name" : "SomeName3"
                            }, 
                            "characteristic" : {
                                "skills" : "bad"
                             }
                            }
                    ], 
                    "teamname" : "SomeTeam2"
                } 
                    ]
              }

我需要重命名数组和字段,并以不同的形式查看信息。我对聚合框架的期望是:

代码语言:javascript
复制
    {
    "team_players" : [
    {
    "player_name" : "SomeName1",
    "player_skills" : "good" ,
    "team_name" : "SomeTeam1"
    },
    {
    "player_name" : "SomeName2",
    "player_skills" : "good" ,
    "team_name" : "SomeTeam1"
    },
    {
    "player_name" : "SomeName3",
    "player_skills" : "bad" ,
    "team_name" : "SomeTeam2"
    }
    ]
    }

用aggregation-framework查询结果的正确方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-02 21:12:02

您可以结合使用$reduce$concatArrays来转换所有的best_players。

就像这样

代码语言:javascript
复制
db.colname.aggregate(
{"$project":{
  "team_players":{
    "$reduce":{
      "input":"$teams",
      "initialValue":[],
      "in":{"$concatArrays":[
        "$$value",
         {"$map":{
            "input":"$$this.best_players",
            "as":"bp",
            "in":{
              "player_name":"$$bp.contact.name",                             
              "player_skills":"$$bp.characteristic.skills",
              "team_name":"$$this.teamname"
           }
        }}
      ]}
    }
  }
}});
票数 0
EN

Stack Overflow用户

发布于 2018-08-02 21:18:26

这个运行得很好。

代码语言:javascript
复制
     db.are.aggregate([
    { "$unwind": "$teams" },
    { "$unwind": "$teams.best_players" },
    {
        "$group": {
            "_id": null, "team_players": {
                "$push":
                {
                    "player_name": "$teams.best_players.contact.name",
                    "player_skills": "$teams.best_players.characteristic.skills",
                    "team_name": "$teams.teamname"
                }
            }
        }
    }
])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51654338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档