增加嵌套值

时间:2014-11-13 21:56:59

标签: mongodb meteor

我按照以下方式创建玩家。

Players.insert({
  name: name,
  score: 0,
  items: [{'name': 0}, {'name2': 0}...]
});

如何增加特定玩家和特定项目名称的分数(如果需要,可以继续)?

抱歉可怕的措辞:p

2 个答案:

答案 0 :(得分:3)

嗯,答案是 - 就像在生活中一样 - 通过分解来简化问题。

为了避免mongoDB中的数组 - 毕竟,对象可以拥有任意数量的键。所以,我的结构变成了:

{
  "_id": <id>,
  "name": <name>,
  "score": <score>,
  "items": {}
}

并在items中增加动态密钥:

// create your update skeleton first
var ud = { $inc: {} };

// fill it in
ud.$inc['item.' + key] = value;

// call it
db.Players.update(player, ud, true);

运作魅力:)

答案 1 :(得分:0)

让我们说:

{
    "_id" : ObjectId("5465332e6c3e2eeb66ef3683"),
    "name" : "Alex",
    "score" : 0,
    "items" : [
        {
            "food" : 0
        }
    ]
}

要进行更新,您可以执行以下操作:

db.Players.update({name: "Alex", "items.food": {$exists : true}}, 
                  {$inc: {score: 1, "items.$.food": 5}})

结果:

{
    "_id" : ObjectId("5465332e6c3e2eeb66ef3683"),
    "name" : "Alex",
    "score" : 1,
    "items" : [
        {
            "food" : 5
        }
    ]
}

由于更新阵列所需的位置操作符,如果文档不存在,我不确定您是否可以插入。