2013-07-05 6 views
20

Mongoose şemasında, bir String olan bir alan var ve bir JSON nesnesini depolayabilmek istiyorum. Mümkün mü? Postgres'de, bir string sütununa bir sözlük depolamak mümkündür.Mongoose'ta Json Nesnesinin Saklanması Dize anahtarı

Bunu yapmak istiyorum çünkü sözlük (aslında JS'deki bir JSON nesnesi) sadece basit bir okuma ve yazma değeridir ve sorgulara ihtiyaç duymaz, aynı zamanda, yalnızca bir değer ve bir değer dizisi olmadığı için .

cevap

66

Evet, yalnızca {myJsonProperty: JSON.stringify(myObject)} depolayabilirsiniz. Umarım aynı zamanda mongoose şemanızda {myJsonProperty: Object}'u ayarlayabilir ve tüm nesneyi bir sebep olmadan bir dizeye dönüştürmeden saklayabilirsiniz. Bir şema ile yuvalanmış bir belge olmak zorunda değil, sadece bir javascript nesnesi olabilir.

+5

Sadece bir nesne kaydedebilir miyim? Emin misiniz? Bu benim için ideal olurdu ama Mongoose Docs bu tipten bahsetmiyor. –

+7

Evet. Gerçek bir şey-gitmek özelliği istiyorsanız 'Karışık 'türünü de kullanabilirsiniz. https://github.com/LearnBoost/mongoose/blob/3.6.14/lib/schema/mixed.js –

+0

Karışık veya nesne kullanmalı mıyım? Temel olarak bir JSON nesnesini saklamak istiyorum. Peki, daha iyi ne olurdu? –

0

Kabul edilen cevap durumların çoğu için iyidir. Ancak, depolamak istediğiniz bir nesneye sahipseniz ve nesne anahtarları üzerinde herhangi bir denetiminiz yoksa (örneğin, kullanıcı tarafından gönderilmiş olabilir), bunları dizili JSON olarak saklamayı düşünebilirsiniz. Bu, MongoDB tarafından keys must not contain the reserved characters$ veya .'un getirdiği sınırlamanın üstesinden gelmenize izin verir.

Örneğin, bu kullanarak Gelincik Alıcılar ve ayarlayıcılar elde edebilirsiniz:

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

bunu olduğu gibi "Nesne" json kaydedebilirsiniz için saha formu "Dize" türünü değiştirmek eğer.

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