4

ご挨拶、

私は次の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"
}

これが私が(PHPで)sofarを試したものですが、役に立ちませんでした:

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

しかし、それは機能しておらず、私は今完全に立ち往生しています。

どんな助けでも大歓迎です。前もって感謝します、

4

1 に答える 1

17

イーモール、

「通知」キーは実際には配列ではないため、$pull 演算子は使用しているドキュメントでは機能しません。これはむしろ、番号付きのキーを持つ埋め込みドキュメントであり、表面的には配列に似ています。このドキュメント構造を維持し、番号付きキーの名前を自動的に変更する方法はありません (私が知っていることです)。

ドキュメントを少しリファクタリングすると、次のようになります。

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

要素には暗黙的に番号が付けられます。これは配列になっているので、無料で取得できます。次のように $pull 演算子を使用できます (私は PHP ドライバーに詳しくないので、同等のシェルを提供します)。

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

ドキュメントを識別するために「toUname」キーを任意に使用しましたが、_id フィールドを使用する必要があると思います。また、メッセージの「id」キーを使用して、配列からプルするメッセージを識別しています。これは、はるかに安全であり、配列が変更された場合に間違ったメッセージを誤って削除しないようにするためです。削除する配列の序数を特定しました。

それが役立つことを願っています。

于 2010-12-19T17:12:27.857 に答える