Gibt es eine Möglichkeit, ein heterogenes Array als Schema-Eigenschaft anzugeben, wo es sowohl ObjectIds als auch Strings enthalten kann? Ich möchte so etwas wie die folgenden haben:Mungo füllt entweder ObjectId-Referenz oder String
var GameSchema = new mongoose.schema({
players: {
type: [<UserModel reference|IP address/socket ID/what have you>]
}
ist die einzige Option eine Mixed
Art, die ich selbst verwalten? Ich bin über discriminators gelaufen, die etwas vielversprechend aussehen, aber es sieht so aus, als ob es nur für Filialdokumente und nicht für Verweise auf andere Schemas funktioniert. Natürlich könnte ich einfach eine UserModel
Referenz haben und eine UserModel
erstellen, die nur die IP-Adresse oder was auch immer ich verwende, um sie zu identifizieren, aber das scheint, könnte es schnell außer Kontrolle geraten in Bezug auf Platz (mit einem Modell für jeden IP finde ich Geräusche schlecht).
EDIT:
Beispiel:
{ players: [ ObjectId("5fd88ea85...."), "192.0.0.1", "192.1.1.1", "192.2.2.1"] }
Im Idealfall würde dies ausgefüllt werden:
Ein Spiel eine angemeldete Benutzer hat, drei anonyme Benutzer, das Dokument wie folgt aussehen sollte
{ players: [ UserModel(id: ..., name: ...), "192.0.0.1", "192.1.1.1", "192.2.2.1"] }
EDIT:
Ich habe mich entschieden, eine andere Route zu gehen: anstatt Typen zu mischen, unterscheide ich mich mit anderen Eigenschaften. Etwas wie folgt aus:
players: [
{
user: <object reference>,
sessionID: <string>,
color: {
type: String
},
...other properties...
}
]
Ich habe eine Prüfung die nur eine von user
oder sessionID
sind bevölkert für einen bestimmten Eintrag gewährleistet. In mancher Hinsicht ist dies komplexer, aber es ist nicht notwendig, diese Art des bedingten Auffüllens durchzuführen und herauszufinden, welcher Typ jeder Eintrag ist, wenn man über sie iteriert. Ich habe keine der Antworten ausprobiert, aber sie sehen vielversprechend aus.
Wofür möchten Sie das verwenden? Das hat tatsächlich Bedeutung, da es davon abhängt, was Sie vorhaben. Da Sie "ObjectId" erwähnen, würde es vorschlagen, dass Sie auf ein Element in einer anderen/gleichen Sammlung verweisen möchten. Wenn Sie Typen mischen, funktionieren Dinge wie '.populate()' nicht. –
Mein Ziel ist es, entweder eingeloggten Benutzern oder anonymen Benutzern ein Spiel beizutreten. Angemeldete Benutzer sollten das Spiel mit ihrem Login verknüpft haben, anonyme Benutzer (offensichtlich) haben kein Login. 'populate()' ist eines der Dinge, über die ich mir nicht sicher war; Wenn mein Anwendungsfall von Mongoose unterstützt würde, dann gäbe es vermutlich einen Weg, um nur die Einträge im Array, die ObjectIds sind, intelligent zu "bevölkern", aber du sagst, dass das nicht passieren wird? –
Ja, ich sage, das wird nicht passieren. Anstatt zu versuchen, in Kommentaren zu erklären, nehmen Sie sich die Zeit und erweitern Sie Ihren Anwendungsfall (vorzugsweise mit Beispieldaten und gewünschten Ergebnissen) in Ihrer Frage. Ein guter Weg zu einer Frage ist es, sie nicht in Bezug darauf zu formulieren, was * "Sie denken, die Lösung ist" *, sondern einfach das Problem im Hinblick auf das gewünschte Ergebnis zu erklären. Diese Punkte könnten klarer sein, um die besten Ratschläge zu geben, –