MongoDB/PHP:从数组中删除元素

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),但都没有成功:

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

但它不起作用,我现在完全被卡住了。
非常感谢任何帮助。提前致谢,
1个回答

17

Eamorr,

$pull操作符不能在你所使用的文档上工作,因为"notifications"键实际上不是一个数组。它是一个嵌入式文档,带有编号的键,使其表面上类似于一个数组。据我所知,没有办法保持这种文档结构并自动重命名编号键。

如果你稍微重构一下你的文档,让它看起来像这样:

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

元素仍将被隐式编号。现在它是一个数组,因此您可以免费获得它。 您可以像这样使用$pull运算符(我不熟悉PHP-driver,所以我会给出shell等效代码):

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

我随意使用“toUname”键来识别文档,但我想你会想要使用_id字段。此外,我正在使用消息的“id”键来标识从数组中提取的消息,因为它更安全,可以确保在确定要删除的数组序数后,不会意外删除错误的消息。

希望这有所帮助。


如果您确定它是通知数组的正确索引,该如何识别数组项呢? - Kevin Beal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接