2010-12-19 23 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" 
} 

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

は、ここで私は無駄に、(PHPで)SOFAR試みたものです

しかし、それは動作していないと私は今完全に立ち往生しています。

ご迷惑をおかけして申し訳ございません。 「通知」-keyは本当に配列ではありませんので、事前のおかげで、

答えて

16

Eamorr、

は$プルオペレータは、使用している文書上では動作しません。むしろ番号付きのキーを持つ埋め込みドキュメントであり、外見上は配列に似ています。 この文書構造を保持し、番号付きのキーの名前を自動的に変更する方法はありません。

あなたはこのように見えるように、少しドキュメントをリファクタリングした場合:

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

要素がまだ暗黙のうち、番号が付けられます。今は配列なので、無料で入手できます。私は任意に識別するために「toUname」キーを使用

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

: あなたは、この(私はPHP-ドライバーに精通していないですので、私はあなたのシェル相当を与えている)のような$プル演算子を使用することができます私はあなたが_idフィールドを使いたいと思うでしょう。また、メッセージの「id」キーを使用して配列から引き出すメッセージを識別します。なぜなら、配列が変更された場合に間違ったメッセージを誤って削除しないようにするためです。削除する配列序数を特定しました。

私は役立つことを願っています。

+0

あなたが通知配列の正しいインデックスであることが確かであれば?それでは、どのように配列項目を特定できますか? –

関連する問題