2013-01-07 15 views
8

Ich habe ein mongo Objekt und möchte es über mongoose für meine Web-App zugreifen. Das Schema, das ich definiert habe, hat eine Object Speichern Benutzer IDs und eine 3-Level-Wert (ja, vielleicht oder nein).Mungo Variable Schlüssel Name

z.B.

"user_info": { 
    "<id_value_1>": "y", 
    "<id_value_2>": "n" 
} 

Die id_value_* s oben sind die Benutzer-Session-IDs so eine lange Reihe von zufälligen Zeichen. Wie kann ich dafür einen mongooseSchema erstellen?

  1. Würde user_info: {String, String} funktionieren?

  2. Ich könnte es umstrukturieren, so dass die user_info ist eine Anordnung von Objekten { "sessionid": "<value>", "value: "y"}, die in Ordnung wäre, ist dies die beste Option?

Antwort

8

Sie werden besser dran, wenn Sie dynamische Schlüssel in Ihrem Schema vermeiden und gehen Sie mit Ihrer zweiten Idee:

user_info: [{sessionid: String, value: String}] 

können Sie verwenden die $ positional operator zu aktualisieren einzelne user_info Array-Elemente von sessionid.

+0

Können Sie erläutern, warum es besser ist, dynamische Schlüssel zu vermeiden? Ist es nur weil Mungo nicht damit umgehen kann? – ruX

+3

@ruX Sie können dynamische Schlüssel nicht indizieren, sie sind nicht so einfach, Abfragen zu erstellen, Sie können kein nützliches Mongoose-Schema für sie definieren ... – JohnnyHK

0

Nach dem obigen Prüfung fand ich, dass das Schema als user_info: { String: String } definiert eine gültige Art und Weise ist es, diese (in der Frage Option 1) genannte, zu tun.

+0

Ich glaube, diese Option nicht funktioniert, da ich dies die Web-App ist fehlgeschlagen ändern implementiert, so siehe die Antwort von @JohnnyHK –

0

Sie können Objekte und Arrays in Ihrem Schema definieren. Sie können sie sogar kombinieren. Zum Beispiel ist dies ein Array von Objekten:

var user = new Schema({ 
    foo: [ { 
     address: {type: String}, 
     email: {type: String, unique: true} 
    }], 
    bar: [ "simple", "array" ] 
}); 
+1

Meine Frage bezog sich auf die Tatsache, dass der Schlüssel keinen einfachen Namen wie 'Adresse' hat, sondern der Schlüssel wird im Code erzeugt, aber das ist ein gültiger Weg wie in Teil 2. von meine Frage –

3

Sie können mit Schematyp versuchen, wie diese Weise Mixed

var user = new Schema({ 
    info: [Schema.Types.Mixed] 
}); 

user.info = { any: { thing: 'i want' } }; 
user.markModified('info'); 

Sie lesen können mehr darüber here