在Mongoose String键中存储Json对象

时间:2013-07-05 23:01:33

标签: node.js mongodb mongoose

在我的Mongoose模式中,我有一个String字段,我希望能够在其中存储JSON对象。可能吗?在Postgres中,可以将字典存储在字符串列中。

我想这样做是因为字典(实际上是JS中的JSON对象)只是一个简单的读写值而且不需要查询,但是,因为它只是一个值而不是值数组。

5 个答案:

答案 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
}