2012-05-06 7 views
13

मैं इस सप्ताह के अंत में मोंगोडब और नोड.जेएस के साथ गड़बड़ कर रहा हूं और मुझे नेस्टेड ऑब्जेक्ट्स/दस्तावेजों को अपडेट करने के बारे में मोंगोडब डॉक्स के माध्यम से कुछ परेशानी हो रही है।नेस्टेड ऑब्जेक्ट में कोई मान बढ़ाएं?

मुझे लगता है मैं पता लगाने के लिए PlayerName के आधार पर playerScore का मूल्य बढ़ाने के लिए कोशिश कर रहा हूँ एक संग्रह है, जिसमें दस्तावेज इस तरह दिखना है ..

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

मुझे लगता है कि यह ज्यादातर मेरे पास आता है जो 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

यह दस्तावेज़ एकाधिक खिलाड़ियों को कैसे प्रबंधित करेगा? मूल प्रश्न के दस्तावेज़ संरचना के साथ क्या गलत था? ऐसा लगता है कि वह एक खेल में कई खिलाड़ियों का प्रतिनिधित्व करना चाहता है। क्या आप प्रति गेम एक खिलाड़ी प्रति गेम प्रस्तावित कर रहे हैं? आप सही अपडेट को कैसे अपडेट करेंगे, आपके अपडेट में गेमनाम के अलावा कोई चयनकर्ता नहीं है ... –

+0

प्लेयरनाम सिर्फ प्लेसहोल्डर है। यह {$ inc: {"players.bobby.score" हो सकता है: 1}} –

+0

यह वैध दस्तावेज़ की तरह नहीं दिखता है जबतक कि आप वास्तव में प्रत्येक खिलाड़ी का प्रतिनिधित्व करने के लिए अलग-अलग फ़ील्ड _name_ नहीं लेते हैं। एक स्पष्टीकरण के रूप में, आप इस दस्तावेज़ संरचना से किसी विशेष गेम के लिए प्लेयर नामों की सूची कैसे प्राप्त करेंगे? –

संबंधित मुद्दे