2014-11-13 2 views
0

Я создаю игроков следующим образом.Приращение вложенного значения

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

Как увеличить счет в конкретном игроке и конкретном наименовании предмета (если необходимо, при необходимости)?

Извините за жуткой формулировкой: р

+0

Можете ли вы объяснить немного больше, какие поля именно ваш планирующих приращение. Обратите внимание, что есть список, так что ...? –

+0

Извините за ужасную формулировку. Я знаю _id для Игрока, и я хочу увеличить значение, соответствующее известному ключу в массиве items в записи игрока. В псевдо-javascript Players [_id] .items [key] ++. –

ответ

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); 

Работает очарование :)

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 
     } 
    ] 
} 

I я не уверен, что вы можете cument не существует из-за оператора позиционирования, необходимого для обновления массива.

Смежные вопросы