2016-02-06 51 views
0

我有以下數據結構,我試圖從'藝術家'數組中刪除一個項目。如何刪除Mongodb/Golang中的數組項目?

[ 
    { 
     "id": "56b26eeb4a876400011369e9", 
     "name": "Ewan Valentine", 
     "email": "[email protected]", 
     "artists": [ 
      "56b26f334a876400011369ea", 
      "56b2702881318d0001dd1441", 
      "56b2746fdf1d7e0001faaa92", 
     ], 
     "user_location": "Manchester, UK" 
    } 
] 

這裏是我的功能...

// Remove artist from user 
func (repo *UserRepo) RemoveArtist(userId string, artistId string) error { 
    change := bson.M{"artists": bson.M{"$pull": bson.ObjectIdHex(artistId)}} 
    fmt.Println(userId) 
    err := repo.collection.UpdateId(bson.ObjectIdHex(userId), change) 
    return err 
} 

,我發現了以下錯誤:

{ 
    "_message": { 
    "Err": "The dollar ($) prefixed field '$pull' in 'artists.$pull' is not valid for storage.", 
    "Code": 52, 
    "N": 0, 
    "Waited": 0, 
    "FSyncFiles": 0, 
    "WTimeout": false, 
    "UpdatedExisting": false, 
    "UpsertedId": null 
    } 
} 

回答

2

$pull運算符是一個 「頂級」 運營商在更新語句,所以你只是有這個錯誤的方式:

change := bson.M{"$pull": bson.M{"artists": bson.ObjectIdHex(artistId)}} 

更新操作符的順序始終是操作員第一,操作第二。

如果在「頂級」鍵上沒有操作符,MongoDB會將其解釋爲「普通對象」來更新和「替換」匹配的文檔。因此,密鑰名稱中有關$的錯誤。

+0

完美!非常感謝! –