2012-05-06 20 views
13

Bu hafta sonu mongodb ve node.js ile uğraşıyorum ve yuvalanmış nesnelerin/belgelerin güncellenmesiyle ilgili mongodb dokümanlarından geçmekte zorlanıyorum.Yuvalanmış bir nesnede bir değer mi artırılmalı?

Ben belgeler bu gibi bakmak olduğu bir koleksiyona sahip ..

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

Ben playername dayalı playerScore değerini artırmak için öğrenmek çalışıyorum.

Sanırım bu çoğunlukla NoSQL metodunu anlamadığım için bana geliyor. Oyuncular için bir dizi kullanmanın ikinci düşünceleri bile var, bu yüzden herhangi bir girdi takdir edilecektir.

Teşekkürler!

+1

sözdiz0iniz geçersiz –

cevap

18

istediğiniz yapısı şöyledir:

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

Eğer oyuncu Joe isminde bir skoru arttırmak için şunu kullanırsınız:

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

karşılamak gerekir çünkü posterin yapısı ile karıştırıldım. {PlayerName, playerScore} ne anlama geliyor? –

+0

Karışıklığı görüyorum - oyuncuların her bir belgenin {playerName: "dizgisi", playerScore: "sayı"} içerdiği bir dizi belge olduğunu varsayıyordum, ama tabii ki yazdığı şey bu değildi. Geri gelene ve açıklığa kavuşana kadar beklememiz gerekecek, sanırım ... –

+0

Evet - üzgünüm, yapının iç içe geçmiş nesne için bir veri türü belirtmeyi atlayacak kadar örtülü olduğunu düşündüm. Tek bir oyunla çalışmak için belirttiğiniz şeyi elde edebildim, ancak belirli bir oyuna bakmaya çalışırsam işe yaramadı. Ben şimdi gerçek bir iş yaptıktan sonra bu arka brülöre koydum. Düşünce :) – JackM

4

Sana

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

Sonra skoru güncelleyebilir artık şöyle belgenizi yapılandırması gerektiğini inanıyoruz:

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

bu belge nasıl birden fazla oyuncuyu yönetecek? Orijinal sorudaki belge yapısının nesi yanlıştı? Bir oyunda birden fazla oyuncuyu temsil etmek istiyor gibi görünüyor. Oyun başına oyuncu başına bir belge mi öneriyorsunuz? Doğru olanı güncellemeyi nasıl bileceksiniz, güncellemenizde gameName dışında hiç seçici yok ... –

+0

playerName burada bir yer tutucudur. {$ Inc: {"players.bobby.score": 1}} –

+0

, her oyuncuyu temsil etmek için farklı alanlara sahip olmayı planladığınız sürece bu geçerli bir belgeye benzemez. Bir açıklama olarak, bu belge yapısından belirli bir oyun için oyuncu isimlerinin listesini nasıl alırsınız? –

İlgili konular