具有条件

时间:2015-11-17 22:07:03

标签: json mongodb

我试图绕过一些更复杂的MongoDB查询。我已经阅读了一些有些相关的问题,但我还没有能够找出适合我所处情况的最佳方法。说我是试图用记录的不同俱乐部足球比赛索引DVD的集合,并且我在集合中建模了如下(缩写):

{ 
  "dvdId" : "10021", 
  "dateSubmitted" : ISODate("2015-11-17T15:42:21.248Z"),
  "featuredPlayerNames": [
    "Sam B. Clement", 
    "John C. Carter", 
    "Gabriel M. Malinowski", 
    "Jimmy I. Vincent", 
    "George L. Spears", 
    "Roland M. Nelson", 
  ],
  "matches" : [ 
    { 
      "startTime" : 0,
      "winningTeamIndex": 0,
      "teams" : [ 
        { 
          "teamName": "Hornets",
          "players" : [ 
            { 
              "name" : "Sam B. Clement", 
              "position" : "striker" 
            }, 
            { 
              "name" : "John C. Carter", 
              "position" : "halfback" 
            },
          ] 
        }, 
        { 
          "teamName": "Hurricanes",
          "players" : [ 
            { 
              "name" : "Gabriel M. Malinowski", 
              "position" : "fullback" 
            }, 
            { 
              "name" : "Jimmy I. Vincent", 
              "position" : "keeper" 
            },
          ] 
        } 
      ] 
    },
    { 
      "startTime": 5602,
      "winningTeamIndex": 1,
      "teams" : [ 
        { 
          "teamName": "Raiders",
          "players" : [ 
            { 
              "name" : "Sam B. Clement", 
              "position" : "halfback" 
            }, 
            { 
              "name" : "George L. Spears", 
              "position" : "striker" 
            },
          ] 
        }, 
        { 
          "teamName": "Hurricanes",
          "players" : [ 
            { 
              "name" : "Roland M. Nelson", 
              "position" : "striker" 
            }, 
            { 
              "name" : "Jimmy I. Vincent", 
              "position" : "keeper" 
            },
          ] 
        } 
      ] 
    },    
  ], 
}

到目前为止我做了什么。 我已经弄清楚如何让它在第一级属性和数组上进行一些简单的操作,例如返回以感兴趣的玩家和/或其他感兴趣的玩家为特色的DVD;例如,db.dvds.find({featuredPlayerNames: {$in: ['Sam B. Clement', 'John C. Carter']}});

我需要帮助的地方。 我现在试图找出如何使用更复杂的操作查询Mongo数据库,例如包含具有以下条件的匹配项的返回文档:

  • 感兴趣的团队是获胜团队
  • 感兴趣的玩家和同一团队中感兴趣的其他玩家
  • 感兴趣的玩家和不同团队的其他感兴趣的玩家
  • 获胜团队感兴趣的玩家
  • 感兴趣的玩家玩感兴趣的位置
  • 感兴趣的玩家玩感兴趣的位置和感兴趣的玩家在不同的团队中扮演感兴趣的位置

完成高级查询的最佳方法是什么?在文档和我阅读类似问题后徘徊(1 2 3 4 5 6 7 {{ 3}} 8 9 10 11 12*),我发现我可能需要使用$elemMatch$cond$in$all$match,{{ 1}},$unwind和/或聚合框架,但除了不熟悉其中的许多内容之外,我还看到了很多不同的意见和方法,而且似乎没有一个真正将嵌套查询与特定结合起来条件(如获胜球队的球员或不同球队的球员)。

现在我可以学习如何在正确的方向上推动大部分工作。如果看起来某些内容对我的情况更有效,我也可以在这里重新构建数据结构(前提是我可以像2v2v2那样为匹配添加更多团队)。

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,以允许简单查询而不是编写复杂查询的方式构建数据更快更容易。重新格式化数据集可能是一次性成本,而昂贵的查询可能会执行数百万次。

您的问题:

  • teamX是一支成功的团队
    • 重新格式化数据以添加matches.winningTeamName字段
    • {matches.winningTeamName:teamX}
    • 或重新格式化数据以添加matches.teams.winner字段
    • {matches.teams:{$ elemMatch:{winner:true,teamName:teamX}}}
  • 同一队伍中的playerX和playerY
    • matches.teams:{$ and:[{players.name:playerX},{players.name,playerY}]}
    • 或重新格式化数据以添加matches.teams.playerList字段
    • {matches.teams.playerList:{$ all:[playerX,playerY]}}
  • 不同球队的playerX和playerY
    • 不确定,我认为你可以用$和$ not的组合做到这一点,但没有设置数据库我猜测。
  • 获胜团队的playerX
    • 重新格式化数据以添加matches.teams.winner字段
    • {matches.teams:{$ elemMatch:{winner:true,players.name:playerX}}}
  • playerX播放位置X
    • {matches.teams.players:{$ elemMatch:{name:playerX,position:positionX}}}
  • 再次与不同的团队......

希望有帮助...