2012-05-06 79 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

是的 - 對不起,我認爲結構足夠隱含,可以跳過指定嵌套對象的數據類型。我能夠得到你指定的單個遊戲的工作,但是如果我嘗試查找特定的遊戲,它似乎並沒有工作。我已經把這個放在了後面的燃燒器上,但我真的想完成一些真正的工作:) – JackM

4

我相信,你就必須構建你的文件,而不是像

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

然後你就可以更新比分:

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

本文檔將如何處理多個玩家?原始問題的文件結構有什麼問題?似乎他想代表一個遊戲中的多個玩家。你是否每場比賽都提供一份文件?你如何知道更新正確的,在你的更新中除了gameName之外沒有選擇器... –

+0

playerName只是一個佔位符。它可能是{$ inc:{「players.bobby.score」:1}} –

+0

這看起來不像是有效的文檔,除非你真的打算用不同的字段_name_來表示每個玩家。作爲一個澄清,你如何從這個文檔結構中獲得特定遊戲的玩家名單? –