2010-12-19 27 views
4

問候,的MongoDB/PHP:從數組中刪除元素

我有以下MongoDB的對象:

{ 
    "_id": ObjectId("4d0e28938b012fe28754715a"), 
    "notifications": { 
    "0": { 
     "type": "privateMessage", 
     "fromUname": "Eamorr2", 
     "time": 1292773522, 
     "id": "1lfw70h789u13a1e67pv" 
    }, 
    "1": { 
     "type": "privateMessage", 
     "fromUname": "Eamorr2", 
     "time": 1292773522, 
     "id": "iwoidjsoskqp23nlwof" 
    } 
    }, 
    "toUname": "Eamorr" 
} 

我試圖刪除元素0,離開我:

{ 
    "_id": ObjectId("4d0e28938b012fe28754715a"), 
    "notifications": { 
    "0": { 
     "type": "privateMessage", 
     "fromUname": "Eamorr2", 
     "time": 1292773522, 
     "id": "iwoidjsoskqp23nlwof" 
    } 
    }, 
    "toUname": "Eamorr" 
} 

這裏就是我試過SOFAR(在PHP),無濟於事:

$customerNotifications->update(array('toUname'=>$uname),array('$pull'=>array('notifications'=>$key))); 

但它不工作,我現在完全卡住了。

任何幫助非常感謝。在此先感謝,

回答

16

Eamorr,

的$拉動運營商將不會對您正在使用的文檔工作,因爲「通知」 - 鍵是不是一個真正的數組。它是一個嵌入式文檔,帶有數字鍵,使其表面看起來像一個數組。 有沒有辦法(我知道)保持這個文檔結構,並自動重命名數字鍵。

如果你稍微重構你的文件,看起來像這樣:

{ 
    "notifications": [ 
    { 
     "type": "privateMessage", 
     "fromUname": "Eamorr2", 
     "time": 1292773522, 
     "id": "1lfw70h789u13a1e67pv" 
    }, 
    { 
     "type": "privateMessage", 
     "fromUname": "Eamorr2", 
     "time": 1292773522, 
     "id": "iwoidjsoskqp23nlwof" 
    } 
    ], 
    "toUname": "Eamorr" 
} 

元素仍將編號,含蓄。它現在是一個數組,所以你可以免費獲得。 可以使用$拉動運營商這樣的(我不熟悉PHP驅動程序,所以我給你的外殼當量):

db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}}); 

我隨意使用的「toUname」鍵來標識文件,但我想你會想使用_id字段。此外,我使用消息的「id」鍵來標識要從數組中提取的消息,因爲它更安全,並且確保在數組發生更改時不會意外刪除錯誤的消息您確定要刪除的數組序號。

我希望有幫助。

+0

如果您確定這是通知數組的正確索引,該怎麼辦?那麼你怎麼能確定陣列物品? – 2012-12-19 18:30:35