2013-03-07 80 views
2

我的目标是这样的:如何更新MongoDB中数组的子数组场

Stats = { 
    name: 'filters' 
    variants: [ 
    { 
     variant: 'A' 
     displayed: 123 
     actions: [ 
     { 
      name: 'clicked' 
      triggered: 12 
     } 

     ] 
    }, 
    { 
     variant: 'B' 
     displayed: 123 
     actions: [ 
     { 
      name: 'clicked' 
      triggered: 12 
     } 
     ] 
    } 
    ] 
} 

我也有变种的数组,其内部数组的操作。我想为选定的variantactions.name增加triggered字段。我在meteor.js中使用它。

我查找查询看起来象下面这样:

Stats.find({ 
    name: 'filters', 
    variants: { 
    $elemMatch: { 
     variant: 'A', 
     'actions.name': 'clicked' 
}}}) 

现在,如果对象存在,我想这样做下面,但我知道这是行不通的。

Stats.update({ 
    name: 'filters', 
    variants: { 
    $elemMatch: { 
     variant: 'A', 
     'actions.name': 'clicked' 
}}}, 
{ 
    $inc: { 
    'variants.$.actions.$.triggered': 1 
}}) 

我知道位置$运营商充当更新查询选择的第一场比赛的占位符。但也许你有任何其他想法如何做到这一点?

+0

似乎并没有成为一个办法做到这一点。昨天刚刚提出了一个类似的问题:http://stackoverflow.com/q/15236322/1259510 – JohnnyHK 2013-03-07 13:27:15

回答

1

我结束了扁平化的结构:

Stats = [ 
    { 
    name: 'filters' 
    variant: 'A' 
    displayed: 123 
    actions: [ 
     { 
     name: 'clicked' 
     triggered: 12 
     } 
    ] 
    }, 
    { 
    name: 'filters' 
    variant: 'B' 
    displayed: 123 
    actions: [ 
     { 
     name: 'clicked' 
     triggered: 12 
     } 
    ] 
    } 
] 

,在这里我可以很容易地递增triggered值:

Stats.update({ 
    name: 'filters', 
    variant: 'A', 
    'actions.name': 'clicked' 
}, { 
    $inc: { 
    'actions.$.triggered': 1 
}}) 

我在服务器端仅使用此代码。无论如何,感谢您的帮助!