2013-01-07 21 views
8

Mam obiekt mongo i chcę uzyskać do niego dostęp przez mongoose dla mojej aplikacji internetowej. Zdefiniowany przeze mnie schemat ma Object przechowywanie identyfikatorów użytkowników i 3-poziomową wartość (tak, może lub nie).Nazwa zmiennej zmiennej Mongoose

np.

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

W id_value_* s powyżej są identyfikatory sesji użytkowników, tak długim ciągiem przypadkowych znaków. Jak mogę dla tego utworzyć mongooseSchema?

  1. Czy user_info: {String, String} będzie działać?

  2. Mogę zrestrukturyzować to tak, że user_info jest tablicą obiektów { "sessionid": "<value>", "value: "y"}, co byłoby ok, czy to najlepsza opcja?

Odpowiedz

8

Będziesz lepiej jeśli uniknąć dynamicznych kluczy w schemacie i iść z drugim idei:

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

można użyć $ positional operator, aby zaktualizować poszczególne elementy tablicy user_info przez sessionid.

+0

Czy możesz wyjaśnić, dlaczego lepiej unikać kluczy dynamicznych? Czy to dlatego, że mangusta nie poradzi sobie z tym? – ruX

+3

@ruX Nie można indeksować kluczy dynamicznych, są one niezręczne w budowaniu zapytań, nie można dla nich zdefiniować przydatnego schematu Mongoose ... – JohnnyHK

0

Po przetestowaniu powyższe, uważam, że definiowanie schematu jak user_info: { String: String } jest prawidłowy sposób to zrobić (opcja 1 określonej w pytaniu).

+0

Wierzę, że ta opcja nie działa, ponieważ realizowane to zmienić aplikacja internetowa nie powiodła się, więc zobacz odpowiedź z @JohnnyHK –

0

Możesz zdefiniować obiekty i tablice w swoim schemacie. Możesz nawet je połączyć. Na przykład, to jest tablicą obiektów:

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

Moje pytanie było związane z tym, że klucz nie ma prostej nazwy, takiej jak "adres", a klucz jest generowany w kodzie, ale tak jest to ważny sposób, jak na część 2. moje pytanie –

3

Można spróbować z Type Schema Mieszane jak ten sposób

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

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

można przeczytać więcej na ten temat here