MongoDB / PHP: удалить элемент из массива - PullRequest
4 голосов
/ 19 декабря 2010

Привет,

У меня есть следующий объект 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)));

Но это не работает, и я полностью застрял сейчас.

Любая помощь очень ценится.Заранее спасибо,

1 Ответ

16 голосов
/ 19 декабря 2010

Eamorr,

Оператор $ pull не будет работать с документом, который вы используете, потому что клавиша "notifications" на самом деле не является массивом.Это скорее встроенный документ с пронумерованными ключами, внешне напоминающими массив.Нет способа (о котором я знаю) сохранить структуру документа и переименовать нумерованные ключи автоматически.

Если вы слегка реорганизуете свой документ, это будет выглядеть так:

{
   "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» сообщений для идентификации сообщения, которое нужно извлечь из массива, так как это намного безопаснее и гарантирует, что вы случайно не удалите неправильное сообщение в случае, если массив изменился с тех порВы определили порядковый номер массива для удаления.

Надеюсь, это поможет.

...