MongoDB - 如何在双嵌套数组中使用$ inc

时间:2016-09-14 14:44:00

标签: json mongodb

我每次用户选择标签时都会尝试增加c

我的示例数据集有两个嵌套数组:

{
    "id": 123,
    "labels": [
        {
            "label": "orange",
            "hitCount": 2,
            "hits": [
                {
                    "who": "bob",
                    "c": "2"
                }
            ]
        },
        {
            "label": "red",
            "hitCount": 6,
            "hits": [
                {
                    "who": "bob",
                    "c": "5"
                },
                {
                    "who": "alice",
                    "c": "1"
                }
            ]
        }
    ]
}

例如bob再次选择red,因此我想将红色对象内的bob对象内的c从5增加到6。

我无法$两次使用https://docs.mongodb.com/manual/reference/operator/update/positional/#nested-arrays

在多个数组中导航

所以任何人都知道如何遍历多个级别的数组并获取$inc的引用?

1 个答案:

答案 0 :(得分:0)

我建议您将数据模型更改为:

{
    "id": 123,
    "labels": [
        {
            "label": "orange",
            "hitCount": 2,
            "hits": {
              "bob": 2
            }
        },
        {
            "label": "red",
            "hitCount": 6,
            "hits": {
              "bob":5,
              "alice":1
            }
        }
    ]
}

然后你可以使用这个命令更新命中:

db.hits.update(
    { 'labels.label': 'red' }, 
    { '$inc': { 'labels.$.hitCount': 1, 'labels.$.hits.bob': 1 } }
);

如果您需要使用动态用户名构建更新,则可以执行此操作:

var userName = 'bob';
var updateCommand = {
  $inc: {
    'labels.$.hitCount': 1
  }
};
updateCommand.$inc['labels.$.hits.' + userName] = 1;

db.hits.update({ 'labels.label': 'red' },  updateCommand);