2013-03-07 64 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 
}}) 

我在服務器端僅使用此代碼。無論如何,感謝您的幫助!