簡體   English   中英

MongoDB帶條件的嵌套文檔查詢

[英]MongoDB nested document queries with conditions

我試圖圍繞一些更復雜的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 8 9 10 11 12 * 13 * )后,我發現可能需要使用$elemMatch$cond$in$all$match$unwind$group和/或聚合框架,但除了不熟悉其中的許多方法外,我還看到了許多不同的觀點和方法,而且似乎並沒有真正將嵌套查詢與特定查詢結合在一起的方法。條件(例如獲勝球隊的球員或不同球隊的球員)。

現在,只要朝着正確的方向發展,我就可以學會做大部分的事情。 如果看來某些情況更適合我的情況,我也願意在這里重塑數據的結構(前提是我能夠像2v2v2那樣增加更多球隊參加比賽)。

謝謝!

通常,以允許簡單查詢的方式比編寫復雜查詢的方式更快,更輕松地構造數據。 重新格式化您的數據集可能是一次性的開銷,而昂貴的查詢可能會執行數百萬次。

你的問題:

  • teamX是一支勝利的隊伍
    • 重新格式化數據以添加matchs.winningTeamName字段
    • {matchs.winningTeamName:teamX}
    • 或重新格式化數據以添加matchs.teams.winner字段
    • {matchs.teams:{$ elemMatch:{獲勝者:true,teamName:teamX}}}
  • 同一團隊的玩家X和玩家Y
    • matchs.teams:{$ and:[{players.name:playerX},{players.name,playerY}]}
    • 或重新格式化數據以添加matchs.teams.playerList字段
    • {matchs.teams.playerList:{$ all:[playerX,playerY]}}
  • 不同團隊的playerX和playerY
    • 不確定,我想您可以結合使用$ and和$ not來完成此操作,但是如果沒有設置數據庫,我會猜測。
  • 獲勝隊伍上的playerX
    • 重新格式化數據以添加matchs.teams.winner字段
    • {matchs.teams:{$ elemMatch:{獲勝者:true,players.name:playerX}}}
  • playerX比賽位置X
    • {matchs.teams.players:{$ elemMatch:{名稱:playerX,位置:positionX}}}
  • 再次與不同的團隊...

希望有幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM