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

Eam*_*orr 4 php pull mongodb

问候,

我有以下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"
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除元素0,留下我:

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

这是我尝试过的(在PHP中),但无济于事:

$customerNotifications->update(array('toUname'=>$uname),array('$pull'=>array('notifications'=>$key)));
Run Code Online (Sandbox Code Playgroud)

但它没有用,我现在完全陷入困境.

任何帮助非常感谢.提前致谢,

svj*_*son 16

Eamorr,

$ pull运算符不适用于您正在使用的文档,因为"通知"-key实际上不是一个数组.它是一个嵌入式文档,带有数字键,使其表面上看起来像一个数组.没有办法(我知道)保留此文档结构并自动重命名编号的键.

如果您稍微重构文档,看起来像这样:

{
   "notifications": [
    {
       "type": "privateMessage",
       "fromUname": "Eamorr2",
       "time": 1292773522,
       "id": "1lfw70h789u13a1e67pv"
    },
    {
       "type": "privateMessage",
       "fromUname": "Eamorr2",
       "time": 1292773522,
       "id": "iwoidjsoskqp23nlwof"
    }
  ],
   "toUname": "Eamorr"
}
Run Code Online (Sandbox Code Playgroud)

这些元素仍然会被隐含地编号.它现在是一个阵列,所以你可以免费获得它.你可以像这样使用$ pull运算符(我不熟悉PHP驱动程序,所以我给你的shell等价):

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

我随意使用"toUname"键来识别文档,但我想你会想要使用_id-field.此外,我正在使用消息的"id"键来识别从数组中提取的消息,因为它更加安全,并确保在阵列发生更改后不会意外删除错误消息你确定要删除的数组序号.

我希望有所帮助.