2010-12-17 31 views
13

更新值我有以下mongodb的对象:PHP/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" 
} 

如何设置 “读出” 1其中id = ABCDZZZZ?我使用PHP。

我试过下面的命令:

$driverInboxes->update(array('uname'=>$uname),array('$set'=>array('messages'=>array('id'=>$id,'read'=>'1')))); 

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

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "messages": { 
    "id": "j7zwr2hzx14d3sucmvp5", 
    "read": "1" 
    }, 
    "uname": "Eamorr3" 
} 

我完全卡住。任何帮助非常感谢。

我是否需要拉动整个数组元素,修改并将其重新推回?

提前许多感谢,

+0

[MongoDB更新嵌套数组]可能的重复(http://stackoverflow.com/questions/11261521/mongodb-update-nested-array) – user956584 2015-07-14 17:10:08

+0

其实现在它的可能性:http://stackoverflow.com/questions/ 11261521/mongodb-update-nested-array – user956584 2015-07-14 17:10:55

回答

16

如果你读你的命令,你实际上是在说:“UPDATE WHERE等于这个数组UNAME = Eamorr3 SET消息(ID =等等,读= 1)”

当您在messages上执行$set时,您基本上会指示它将您的数组作为新值。

但是,它看起来像你试图更新一个特定的消息,因为它只是更复杂一点。所以,有两个障碍在这里:

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

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

你能看到你如何更新messages.0.read

这将我们带到问题2。

2:0是你的问题

如果你看一下你在结构蒙戈数据的方式,消息对象实际上是低于平均水平。 “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" 
} 

现在你update命令变成这样:

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

这种结构使得它更容易更新特定的消息或消息的特定部分。

+0

嘿,我正在考虑像你提到的那样重组。我认为这可能是最好的选择。否则,我将不得不查看整个数组,查找对象索引并更新。 – Eamorr 2010-12-17 19:32:19

+0

另请参阅[$ elemMatch](http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch) – webjay 2011-09-26 14:36:57

2

如果您想保留用于各种目的的阵列结构,您可以使用Positional operator。这使您可以利用数组功能($ pop,$ push等),同时能够更新处于未知数组位置的元素。