我有以下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)"
当你进行操作$set时messages,你基本上是在指示它将你的数组作为新值.
但是,看起来您正在尝试将特定消息更新为只读更复杂的消息.所以这里有两个障碍:
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 ) )
此结构使更新特定消息或消息的特定部分变得更加容易.
| 归档时间: |
|
| 查看次数: |
16524 次 |
| 最近记录: |