在我的Mongoose模式中,我有一个String字段,我希望能够在其中存储JSON对象。可能吗?在Postgres中,可以将字典存储在字符串列中。
我想这样做是因为字典(实际上是JS中的JSON对象)只是一个简单的读写值而且不需要查询,但是,因为它只是一个值而不是值数组。
答案 0 :(得分:85)
是的,你可以存储{myJsonProperty: JSON.stringify(myObject)}
。希望你知道你也可以在你的mongoose模式中设置{myJsonProperty: Object}
并存储整个对象,而无需将其转换为字符串。它不必是带有模式的嵌套文档,它可以只是一个普通的javascript对象。
答案 1 :(得分:11)
如果您可以将字段“String”的类型更改为“Object”,则可以按原样保存json。
var schema_obj = new Schema({
field1: Object,
..
});
答案 2 :(得分:6)
接受的答案对大多数情况都有好处。
但是,如果您有一个要存储的对象,并且您无法控制对象键(例如,它们可能是用户提交的),您可能需要考虑将这些存储为stringifed JSON。这使您可以克服MongoDB对keys must not contain the reserved characters $
或.
施加的限制。
您可以使用Mongoose getter和setter实现此目的,例如:
data: {
type: String,
get: function(data) {
try {
return JSON.parse(data);
} catch() {
return data;
}
},
set: function(data) {
return JSON.stringify(data);
}
}
答案 3 :(得分:2)
由于堆栈溢出的6个更改限制,无法更改原始内容。重新发布了很棒的作品Tom,只是在catch块中缺少catch(err)
data: {
type: String,
get: function(data) {
try {
return JSON.parse(data);
} catch(err) {
return data;
}
},
set: function(data) {
return JSON.stringify(data);
}
}
答案 4 :(得分:1)
我们需要保留结构而不是字符串,因此我想出了以下方法来处理此问题:
const setMongoMixedWithBadKeys = data =>
Array.isArray(data)
? data.map(setMongoMixedWithBadKeys)
: typeof data === 'object'
? Object.entries(data).reduce((a, [key,value])=>({...a, [key.replace('.','__').replace('$','___')]:setMongoMixedWithBadKeys(value)}), {})
: data
const getMongoMixedWithBadKeys = data =>
Array.isArray(data)
? data.map(getMongoMixedWithBadKeys)
: typeof data === 'object'
? Object.entries(data).reduce((a, [key, value])=> ({...a, [key.replace('__','.').replace('___','$')]:getMongoMixedWithBadKeys(value)}), {})
: data
data: {
type: Mixed,
get: getMongoMixedWithBadKeys,
set: setMongoMixedWithBadKeys
}