2012-05-06 46 views
13

Tôi đang rối tung xung quanh với mongodb và node.js vào cuối tuần này và tôi đang gặp một số sự cố khi tải xuống các tài liệu mongodb về việc cập nhật các đối tượng/tài liệu lồng nhau.Tăng giá trị trong một đối tượng lồng nhau?

Tôi có một bộ sưu tập, trong đó các tài liệu giống như thế này ..

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

Tôi đang cố gắng để tìm hiểu làm thế nào để tăng giá trị của playerScore dựa trên playername.

Tôi cho rằng điều này chủ yếu là do tôi không hiểu phương pháp NoSQL. Tôi thậm chí còn có những suy nghĩ thứ hai về việc sử dụng một mảng cho người chơi, vì vậy bất kỳ đầu vào nào cũng sẽ được đánh giá cao.

Cảm ơn!

+1

cú pháp của bạn không hợp lệ –

Trả lời

18

Cấu trúc bạn muốn là:

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

Để tăng số điểm người chơi lên một nếu tên của anh ấy là Joe, bạn sẽ sử dụng:

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

Tôi đang bối rối bởi cấu trúc của người đăng. {PlayerName, playerScore} có nghĩa là gì? –

+0

Tôi thấy sự nhầm lẫn - Tôi giả định rằng người chơi là một mảng tài liệu mà mỗi tài liệu chứa {playerName: "string", playerScore: "number"} nhưng tất nhiên đó không phải là những gì anh ấy viết. Chúng tôi sẽ phải chờ cho đến khi anh ấy quay lại và làm rõ, tôi đoán ... –

+0

Có - xin lỗi, tôi nghĩ cấu trúc này đủ tiềm ẩn để bỏ qua chỉ định loại dữ liệu cho đối tượng lồng nhau. Tôi đã có thể có được những gì bạn chỉ định để làm việc với một trò chơi duy nhất, tuy nhiên nó dường như không hoạt động tốt nếu tôi cố gắng tìm kiếm một trò chơi cụ thể. Tôi đã đặt điều này trên đầu ghi lại cho đến bây giờ trong khi tôi nhận được một số công việc thực hiện suy nghĩ :) – JackM

4

Tôi tin rằng bạn sẽ phải cấu trúc tài liệu của bạn thay vì như

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

Sau đó, bạn có thể cập nhật số điểm với:

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

tài liệu này sẽ xử lý nhiều người chơi như thế nào? Có gì sai với cấu trúc tài liệu của câu hỏi gốc? Có vẻ anh ấy muốn đại diện cho nhiều người chơi trong một trò chơi. Bạn đang đề xuất một tài liệu cho mỗi người chơi, mỗi trò chơi? Làm thế nào bạn sẽ biết để cập nhật đúng, không có bộ chọn nào khác ngoài tên game trong bản cập nhật của bạn ... –

+0

playerName chỉ là một trình giữ chỗ ở đây. Nó có thể là {$ inc: {"players.bobby.score": 1}} –

+0

điều này không giống như tài liệu hợp lệ trừ khi bạn thực sự có kế hoạch có _name_ trường khác nhau để đại diện cho mỗi người chơi. Khi làm rõ, bạn sẽ nhận được danh sách tên người chơi cho một trò chơi cụ thể từ cấu trúc tài liệu này như thế nào? –

Các vấn đề liên quan