如何在mongodb中更新数组的子数组字段

时间:2013-03-07 12:05:31

标签: mongodb meteor

我的对象如下:

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

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

我有一系列变种,并且在其中包含一系列操作。我想为选定的triggeredvariant增加actions.name字段。我在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
}})

我知道位置$运算符充当更新查询选择器的第一个匹配项的占位符。但也许你还有其他想法怎么做?

2 个答案:

答案 0 :(得分: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
}})

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

答案 1 :(得分:0)

目前$运算符在minimongo上不可用,甚至在服务器上也存在一些故障(至少在我最后使用它时)。

它是一个已知问题,看起来很快就会修复: https://github.com/meteor/meteor/issues/153