Mongoose: Dokumente in Objekt mit beliebigen Schlüsseln eingebettet?

Erstellt am 12. Jan. 2012  ·  40Kommentare  ·  Quelle: Automattic/mongoose

Gibt es eine Möglichkeit, eingebettete Dokumente in einem Objekt zu verwenden, das keine vordefinierten Schlüssel hat? dh Anstatt eine Situation wie diese zu haben:

var myschema = new mongoose.Schema({
   field : { foo: String, bar: String }
});

Etwas sagen können wie:

var myschema = new mongoose.Schema({
   field : { *: String }
});

Macht es auf diese Weise ein bisschen mehr Array - aber die Idee ist, dass ich die Schlüssel nicht im Voraus kenne, aber ich hätte trotzdem gerne ein eingebettetes Dokument.

enhancement

Hilfreichster Kommentar

Diese Funktion ist ein MUSS.

Alle 40 Kommentare

da ist nicht.

Was ist mit dem Typ Mixed ?

@aheckmann - das habe ich befürchtet, weißt du, ob das auf der Roadmap steht oder ob das nur etwas ist, das nicht allgemein benötigt wird?

@TooTallNate - richtig, das ist die Standardeinstellung. Das Problem ist, dass Sie bei gemischten Dateien alle Validierungs-/Schema-Sachen verlieren, die Sie mit unterstützten (benannten Schlüsseln und Arrays) eingebetteten Dokumenten erhalten.

@ordrin hat noch nie jemand gebraucht

OK, wusste nicht, dass ich etwas so Esoterisches mache! Verdammt.

Ich habe einen Anwendungsfall dafür, zumindest glaube ich, dass es relevant ist.

Ich mache ein ACL-System.

Meine Aufgaben haben _ids, die Strings sind.

Ich möchte diese IDs in die Mitgliedsdatensätze meiner Mitglieder einbetten (eine Reihe von Aufgaben, die sie erledigen können).

Während ich natürlich einfach ein Array von Zeichenfolgen in ihre Eigenschaft "Tasks" einfügen kann, würde ich in diesem Szenario idealerweise gerne DBrefs verwenden, damit ich Metadaten abrufen kann.

@ordrin Ich habe das gerade noch einmal gelesen. Haben Sie sich die Verwendung von Mixed angesehen? Möglicherweise habe ich b/ci missverstanden, dass „eingebettete Dokumente“ anders sind, als MongoDB sie bezeichnet. Hier ist im Allgemeinen, was Sie mit Mixed tun können.

var myschema = new mongoose.Schema({
   field : mongoose.Schema.Types.Mixed
});

Das kommt dem, was Sie gefordert haben, ziemlich nahe. In diesem Fall kann "Feld" jedem beliebigen Wert zugewiesen werden. Sie könnten ihm einfach ein Objektliteral zuweisen und einen benutzerdefinierten Validator hinzufügen, um sicherzustellen, dass die Werte Zeichenfolgen sind.

myschema.path('field').validate(yourCustomValidator, 'your custom vaildator failed msg');

function yourCustomValidator (value) {
  // check that value is an object etc
  return true|false
}

var M = mongoose.model('M', myschema);
var m = new M;
m.field = { might: "work", for: "you" }
m.save();

http://mongoosejs.com/docs/schematypes.html

Ich wollte nur hinzufügen, dass ich nach ähnlichen Funktionen suchte. Ich wollte dynamische Schlüssel mit stark typisierten Schemawerten haben. Es wäre fantastisch, wenn wir die manuelle Überprüfung vermeiden könnten.

new mongoose.Schema({
    dynamicKey: {foo: Number, isAwesome: Boolean}
});

or 

new mongoose.Schema({
    dynamicKey: value is always only a Number
});

+1

+1

+1.

Ich habe einen SO-Beitrag zu diesem Problem gepostet. Wenn jemand eine gute Möglichkeit kennt, eine Eigenschaft mit dynamischen Schlüsseln zu validieren, können Sie dies gerne posten.

Wenn es eingebaut wäre, könnte ich ein Schema wie z

new Schema({
  myDynamicKeyObj: {
    type: Dynamic, 
    key: {type: String, match: /[a-z]*/i}, 
    val: [String] 
  } 
})

+1

Es wäre toll, dynamische Schlüssel zu haben. Wenn Sie ein json-Schema schreiben, können Sie beispielsweise einen ganzzahligen Schlüssel abgleichen:

"^[0-9]+$": {
    "$ref": "#/definitions/mydefinition"
}

eine Lösung mit dynamischen Schlüsseln oder immer noch nicht?
Beispiel für 2 Objekte:
{ 123: { firstname: "firstA", lastname: "lastA" } }
{ 124: { firstname: "firstB", lastname: "lastB" } }

Gleiches Problem. Ich möchte Analysen durchführen, wie in Mongodb-Dokumenten erläutert. http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/

+1

:+1:

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Ich habe das gut gebraucht

+1

Stoppen Sie diese bedeutungslosen +1 , die in den Posteingängen der Leute landen.

Es gibt aus gutem Grund die Schaltflächen „Abonnieren“ und „Reaktion“.

+1

@qqilihq , implementieren Sie plx, dann stoppen wir +1, kthxbye

"niemand hat es vorher gebraucht"
5 Jahre später, eine Menge +1 später, immer noch keine Updates dazu?

Da dies das älteste Problem ist, das ich im Zusammenhang mit diesem Problem finden kann, werde ich es erneut öffnen und # 1522 schließen, damit so viele Personen wie möglich nach Updates suchen können.

Diese Funktion ist ein MUSS.

Wie wurde dieses Feature so leise veröffentlicht, dass ich es nicht bemerkte?! 💯

@adamreisnz lol danke. Wo suchen Sie nach Mongoose-Feature-Updates? Änderungsprotokoll? Zwitschern?

Änderungsprotokoll normalerweise, aber dieses hier muss ich verpasst haben!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen