2016-06-24 18 views
0

Ich habe documents in games collection.Each Dokument zum Halten der Daten verantwortlich ist, dass das Spiel starten erfordert. Hier ist meine Dokumentstruktur- MongoDB/Meteor

Grundsätzlich ist dies eine Struktur meines Kartenspiels (Call-Bridge). Nun, was ich für die Veröffentlichung möchte, ist, dass der Spieler seine hand Daten in seinem Browser (Minimongo) zusammen mit anderen Spielern user, scores, calls Felder hat. Also wird das Abonnement, das in den Browser geht, so sein.

{ 
    _id: 'xxx', 
    players: [ 
      { 
       user:{} // Meteor.users object 
       hand:[] //array 
       scores:[] 
       calls:[] 
      }, 
      { 
       user:{} // Meteor.users object 
       scores:[] 
       calls:[] 
      }, 
      // 2 more player's data, similar to 2nd player's data 

     ], 
    table:[], 
    status: 'some string' 


} 

players.user Objekt eine _id Eigenschaft, die den Benutzer unterscheidet. und in der Meteor veröffentlicht Methode, haben wir Zugang zu this.userId, die dem Benutzer-ID zurück, die den data.It anfordert bedeuten, ich möchte die verschachtelten hand Array des Benutzers, deren _id Matches mit this.userId. Ich hoffe, dass diese Erklärungen Ihnen helfen, genauere Lösung zu schreiben.

Antwort

0

Um eine bestimmte Eigenschaft von einem Array-Element zu erhalten, können Sie etwas wie in der folgenden Zeile schreiben: db.games.aggregate ([{$ abwickeln: "$ players"}, {$ project: {"players.scores"): 1}}]); Dies gibt uns nur die ID und Scores Felder

+0

ich glaube nicht, Aggregation würde für meinen Fall funktionieren. Ich muss einen Fund-Cursor für Meteor veröffentlichen –

1

Was Sie tun müssen, ist Ihre Sammlung "normalisieren". Anstatt Hand-, Punktestand- und Calls im Feld Spieler in der Games-Sammlung zu verwenden, können Sie eine separate Sammlung erstellen, die diese Daten enthält, und den Benutzer _id als "Key" verwenden und dann nur auf den Benutzer _id im Feld Spieler verweisen . Beispielsweise.

erstellen GameStats Sammlung (oder je nachdem, welcher Name, den Sie möchten)

{ 
_id: '2wiowew', 
userId: 1, 
hand:[], 
scores:[], 
calls:[], 
} 

dann in der Spiele-Sammlung

{ 
    _id: 'xxx', 
    players: [userId], 
    table:[], 
    status: 'some string' 


} 

Also, wenn Sie den Inhalt des aktuellen Benutzers erhalten möchten, die Daten anfordert

GameStats.find({userId: this.userId}).hand 

BEARBEITEN

Sie tun Denormalisierung in bestimmten Situationen fördern, aber in dem Code, den Sie oben geschrieben, Array wird nicht funktionieren. Hier ist ein Beispiel aus den mongoDB-Dokumenten.

{ 
_id: ObjectId("5099803df3f4948bd2f98391"), 
name: { first: "Alan", last: "Turing" }, 
birth: new Date('Jun 23, 1912'), 
death: new Date('Jun 07, 1954'), 
contribs: [ "Turing machine", "Turing test", "Turingery" ], 
views : NumberLong(1250000) 
} 
+0

danke für Ihren Vorschlag. Da MongoDB die Denormalisierung fördert, suche ich nach Antworten, die mit meiner Struktur übereinstimmen. :) –