2013-07-05 12 views
20

W moim schemacie Mongoose, mam pole, które jest ciągiem i chcę móc w nim przechowywać obiekt JSON. Czy to możliwe? W Postgresie można przechowywać słownik w kolumnie tekstowej.Przechowywanie obiektu Json w kluczu ciągu Mongoose

Chcę to zrobić, ponieważ słownik (właściwie obiekt JSON w JS) jest po prostu prostą wartością odczytu i zapisu i nie potrzebuje zapytań, ale także, ponieważ jest to tylko jedna wartość, a nie tablica wartości .

Odpowiedz

66

Tak, można po prostu przechowywać {myJsonProperty: JSON.stringify(myObject)}. Mam nadzieję, że wiesz, że możesz również ustawić {myJsonProperty: Object} w swoim schemacie mangusty i przechowywać cały obiekt bez przekształcania go na ciąg bez żadnego powodu. Nie musi to być zagnieżdżony dokument ze schematem, może to być zwykły obiekt javascript.

+5

Mogę po prostu przechowywać obiekt? Jesteś pewny? Byłoby to dla mnie idealne, ale Mongoose Docs nie wspomina tego typu. –

+7

Tak. Możesz również użyć typu 'Mixed', jeśli chcesz mieć właściwość true-anything-goes. https://github.com/LearnBoost/mongoose/blob/3.6.14/lib/schema/mixed.js –

+0

Należy użyć mieszanego lub obiektu. Zasadniczo chcę przechowywać obiekt JSON. Więc co byłoby lepiej? –

0

Przyjęta odpowiedź jest dobra w większości sytuacji.

Jeśli jednak masz obiekt, który chcesz przechowywać i nie masz kontroli nad kluczami obiektu (np. Mogą być przesłane przez użytkownika), możesz rozważyć przechowywanie ich jako JSON ze stringami. Pozwala to na przezwyciężenie ograniczeń nałożonych przez MongoDB na keys must not contain the reserved characters$ lub ..

Można to osiągnąć za pomocą pobierające Mongoose i ustawiające, na przykład:

data: { 
    type: String, 
    get: function(data) { 
    try { 
     return JSON.parse(data); 
    } catch() { 
     return data; 
    } 
    }, 
    set: function(data) { 
    return JSON.stringify(data); 
    } 
} 
6

czy można zmienić typ formularzu pola „string” do „obiektu” można zapisać json, jak to jest.

var schema_obj = new Schema({ 
field1: Object, 
.. 
});