2010-08-13 36 views
8

我正在开发一个web应用程序,它有一个portal-ish组件(像多个面板一样,可以是从列到列的药物,添加或删除)。我使用MongoDB的存储与像这样的格式此信息...

{ 
    _id: ObjectId(...), 
    title: 'My Layout', 
    columns: [ 
     { 
      order: 1, 
      width: 30, 
      panels: [ 
       { title: 'Panel Title', top: 100, content: '...' }, 
       { title: 'Panel Title', top: 250, content: '...' }, 
      ] 
     }, 
     { 
      ... multiple columns ... 
     } 
    ] 
} 

我试图使用原子/修改操作与更新(),这是越来越混乱。如果我只想更新特定面板的一个属性,我该如何参考?

update(
    { _id: ObjectId(...) }, 
    { $set: { columns.[???].panels.[???].top: 500 } 
) 

回答

14

如果您知道数组中的索引,则可以使用点符号直接访问数组元素。

update(
{ _id: ObjectId(xxxx) }, 
{ $set: { 'columns.0.panels.0.top' : 125}} 
) 

请确保您将引号中的点符号路径包含为字符串。

编辑:

要查看关于如何可以动态地工作更详细,我会在PHP举个例子:

$action = array("columns.$colNum.panels.$panelNum" => $newValue); 

是存在positional operator,但它does not appear to be advanced enough改变数组中的数组,这可能会在MongoDB中更改1.7.0

还有一种方法可以替代尝试将此信息填充到嵌套文档中。尝试平坦化。你可以创建一个具有面板&列对象的集合:

列对象:

{ 
_id: // MongoId 
type: 'column', 
user: 'username', 
order: 1, 
width: 30, 
} 

面板对象:

{ 
_id: //MongoId 
type: 'panel', 
user: 'username', 
parentColumn: //the columns _id string 
top: 125, 
left: 100 
} 

然后你就可以发现,通过做属于用户所有列:

find({ type: 'column', user:'username'}); 

您可以通过执行以下操作找到特定列的所有面板:

find({type: 'panel', columnOwner:'ownerID'}); 

由于每一列和面板将通过MongoDB的给它一个唯一的ID,您可以轻松地查询并自动设置选项。

update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}}); 
+0

我不知道这一点。对指标进行硬编码确实不可行。仍试图找出如何使用位置运算符http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator – Dex 2010-08-14 16:46:59

+0

添加更多详细信息 – Klinky 2010-08-15 00:28:12

0

我也有这样的情况,我在$ pull之后跟着$ addToSet替换即更新我需要的东西。

update(
{ _id: ObjectId(...) }, 
{ $addToSet: { columns.$.panels : "new sub-Doc" } 
) 

,然后取下旧值

update({_id:ObjectId(....)},{$pull : { columns.$.panels : {"top" : 100} }}) 
+0

列上的$ for是多少? – 2016-08-07 19:39:25

+0

“$”充当占位符以更新与更新中的查询条件相匹配的第一个元素。请参阅https://docs.mongodb。COM /手动/参考/操作员/更新/位置/#up._S_ – achuth 2016-08-09 09:30:56

相关问题