2015-12-23 137 views
1

我有一個集合,其中包含一個球隊陣列並且包含一個球員陣列。我想從玩家數組中刪除。 我想我知道很熱從數組中刪除,但我不能讓它工作。 有一種情況是,它從團隊數組中刪除了所有元素。從陣列中拉出陣列

這是怎麼文檔的樣子:

"teams" : [ 
    { 
    "_guid" : "5c5b3bc0-a957-11e5-b909-b7a1cbe2c8be", 
    "teamname" : "Ping-Win_team", 
    "_id" : ObjectId("567a68f6a7c726540b2d746b"), 
    "players" : [ 
     ObjectId("567a68f6a7c726540b2d7469"), 
     ObjectId("567a68f7a7c726540b2d746c") 
     ] 
    } 
], 

我的試用期:

db.lobbies.update({ _id: ObjectId('567a68f6a7c726540b2d746a') }, { $pull: { 'teams': { 'players.$': ObjectId('567a68f7a7c726540b2d746c') }}}) 

感謝您的幫助, 阿科什

回答

0

一起應用$pull運營商與$ positional operator在您更新到ch昂貴的name字段。該$ positional operator將標識數組中的正確元而不顯式指定數組中元素的位置更新,因此您的最終更新語句應該是這樣的:

db.lobbies.update(
    { "teams.players": ObjectId("567a68f7a7c726540b2d746c") }, 
    { 
     "$pull": { 
      "teams.$.players": ObjectId("567a68f7a7c726540b2d746c") 
     } 
    } 
) 
+0

感謝您的答案,它工作正常! 但是,你能解釋一下嗎?爲什麼你改成了where子句,通過teams.players而不是父文檔_id找到?我只是好奇,謝謝:) – Akos

+0

@Akos由於位置**'$'**操作符充當匹配查詢文檔的第一個元素的佔位符,因此數組字段必須作爲查詢文檔的一部分出現,因此您在你的查詢中需要'teams'數組字段。 – chridam

0

您可以使用下面的代碼來刪除一個或嵌套數組中

db.sessions.update(
    { 
     "teams": { 
      $elemMatch: { 
       "players": {$in: [ObjectId("567a68f7a7c726540b2d746c")]} 
     } 
    }}, 
    { 
     "$pull": { 
      "teams.$.players": {$in:[ObjectId("567a68f7a7c726540b2d746c")]} 
     } 
    }) 
0

多個值,如果我得到正確你的問題..你可以不拉的玩家ID的一個原因是:

的位置$操作者可以不被用於橫穿多個陣列的查詢,諸如遍歷嵌套在其它陣列內的數組查詢,因爲更換爲$佔位符是一個單一的值

來自:https://docs.mongodb.org/v3.0/reference/operator/update/positional/

否則,您將拉動包含該特定播放器的球隊數組的全部項目。