2012-05-06 4 views
13

В этот уик-энд я встречаюсь с mongodb и node.js, и у меня возникли проблемы с получением документов mongodb относительно обновления вложенных объектов/документов.Приращение значения во вложенном объекте?

У меня есть коллекция, в которой документы выглядят так ..

{ 
gameName: "string", 
slug: "string", 
players: [{playerName, playerScore}, ...] 
} 

Я пытаюсь выяснить, как увеличить значение playerScore на основе Playername.

Я полагаю, что это в основном сводится к тому, что я не понимаю метод NoSQL. У меня даже есть другие мысли об использовании массива для игроков, поэтому любой вход будет оценен.

Спасибо!

+1

Ваш синтаксис недействителен –

ответ

18

Структура вы хотите:

{ 
gameName: "string", 
slug: "string", 
players: [ { playerName: "string", playerScore: number} ] , ...] 
} 

Чтобы увеличить счет игрока на один, если его зовут Джо, вы должны использовать:

db.collection.update({"players.playerName":"Joe"}, { $inc : { "players.$.playerScore" : 1 } } 
+0

Я смущен структурой плаката. Что означает {playerName, playerScore}? –

+0

Я вижу путаницу - я предполагал, что игроки были массивом документов, где каждый документ содержал {playerName: "string", playerScore: "number"}, но, конечно, это не то, что он написал. Нам придется подождать, пока он не вернется и не уточнит, я думаю ... –

+0

Да, извините, я думал, что структура была неявной, чтобы пропустить указание типа данных для вложенного объекта. Я смог получить то, что вы указали для работы с одной игрой, однако, похоже, это не сработало, если я попытаюсь найти конкретную игру. 0: – JackM

4

Я считаю, что вы должны структурировать документ вместо как

 
{ 
gameName: "string", 
slug: "string", 
players: {playerName: {score: playerScore}}, 
} 

Затем вы можете обновить счет с:

 
db.games.update({"gameName": "string"}, 
       {$inc: {"players.playerName.score": 1} 
       }) 
+0

Как этот документ обрабатывает несколько игроков? Что случилось с структурой документа оригинального вопроса? Кажется, он хочет представлять нескольких игроков в игре. Вы предлагаете один документ для каждого игрока за игру? Как вы узнаете, что нужно обновить правильный, в вашем обновлении нет селектора, кроме имени игры. –

+0

playerName - это просто местозаполнитель здесь. Это может быть {$ inc: {"players.bobby.score": 1}} –

+0

Это не похоже на действительный документ, если вы действительно не планируете создавать разные поля _name_ для представления каждого игрока. Как уточнение, как бы вы получили список имен игроков для конкретной игры из этой структуры документа? Игроки –

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