PHP/MongoDB:更新数组中的值

Eam*_*orr 14 php mongodb

我有以下mongodb对象:

{
   "_id": ObjectId("4d0b9c7a8b012fe287547157"),
   "messages": {
     "0": {
       "toUname": "Eamorr3",
       "fromUname": "Eamorr2",
       "time": 1292606586,
       "id": "ABCDZZZ",
       "subject": "asdf",
       "message": "asdf",
       "read": 0   //I want to change this to 1!
    },
    "1": {
       "toUname": "Eamorr1",
       "fromUname": "Eamorr3",
       "time": 1292606586,
       "id": "EFGHZZZ",
       "subject": "asdf2",
       "message": "asdf2",
       "read": 0
    }
  },
   "uname": "Eamorr3"
}
Run Code Online (Sandbox Code Playgroud)

如何将"read"设置为1,其中id = ABCDZZZZ?我正在使用PHP.

我试过以下命令:

$driverInboxes->update(array('uname'=>$uname),array('$set'=>array('messages'=>array('id'=>$id,'read'=>'1'))));
Run Code Online (Sandbox Code Playgroud)

但当我这样做时,覆盖发生,我得到:

{
   "_id": ObjectId("4d0b9c7a8b012fe287547157"),
   "messages": {
     "id": "j7zwr2hzx14d3sucmvp5",
     "read": "1"
  },
   "uname": "Eamorr3"
}
Run Code Online (Sandbox Code Playgroud)

我完全陷入了困境.任何帮助非常感谢.

我是否需要拉出整个数组元素,修改并再次将其推回?

提前谢谢了,

Gat*_* VP 17

如果你读了你的命令,你实际上是在说:"UPDATE WHERE uname = Eamorr3 SET消息等​​于这个数组(id = blah,read = 1)"

当你进行操作$setmessages,你基本上是在指示它将你的数组作为新值.

但是,看起来您正在尝试将特定消息更新为只读更复杂的消息.所以这里有两个障碍:

1:你实际上正在更新 messages.0.read

如果这样做array('$set' => array( 'messages.0.read' => 1 ) ),您将更新正确的元素.关注该链,messages是一个javascript对象,您想要更新属性0.该属性0本身是一个javascript对象,其中包含read您要更新的属性.

你能看到你的更新方式messages.0.read吗?

这给我们带来了问题#2.

2:0对你来说是个问题

如果你看看你在Mongo中构建数据的方式,那么messages对象实际上是低于标准的."0"和"1"目前充当"ids"并且它们不是非常有用.就个人而言,我会用实际的ID来代替"0"或"1"来构造你的对象.

所以你的对象看起来如下:

{
   "_id": ObjectId("4d0b9c7a8b012fe287547157"),
   "messages": {
     "ABCDZZZ": {
       "toUname": "Eamorr3",
       "fromUname": "Eamorr2",
       "time": 1292606586,
       "subject": "asdf",
       "message": "asdf",
       "read": 0   //I want to change this to 1!
    }
  },
   "uname": "Eamorr3"
}
Run Code Online (Sandbox Code Playgroud)

现在你的更新命令变为:

array('$set' => array( 'messages.ABCDZZZ.read' => 1 ) )

此结构使更新特定消息或消息的特定部分变得更加容易.