it-source

Mongoose 문자열 키에 Json 개체 저장

criticalcode 2023. 5. 31. 16:02
반응형

Mongoose 문자열 키에 Json 개체 저장

제 Mongoose 스키마에는 String이라는 필드가 있는데, 그 필드에 JSON 객체를 저장할 수 있기를 원합니다.가능합니까?Postgres에서는 사전을 문자열 열에 저장할 수 있습니다.

사전(실제 JSON 개체)은 단순한 읽기 및 쓰기 값이며 쿼리가 필요하지 않고 하나의 값일 뿐 값 배열이 아니기 때문에 그렇게 하고 싶습니다.

네, 그냥 보관하시면 됩니다.{myJsonProperty: JSON.stringify(myObject)}당신이 또한 그냥 설정할 수 있다는 것을 알기를 바랍니다.{myJsonProperty: Object}mongoose 스키마에서 개체를 아무 이유 없이 문자열로 변환하지 않고 전체 개체를 저장합니다.스키마가 포함된 중첩 문서일 필요는 없으며, 일반 자바스크립트 객체일 수 있습니다.

필드 유형을 "String"에서 "Object"로 변경할 수 있는 경우 json을 그대로 저장할 수 있습니다.

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

받아들여진 대답은 대부분의 상황에서 좋습니다.

그러나 저장할 개체가 있는데 개체 키를 제어할 수 없는 경우(예: 사용자가 제출한 키일 수 있음) 이러한 키를 문자열화된 JSON으로 저장하는 것이 좋습니다.이렇게 하면 키에 예약된 문자가 포함되어서는 안 된다는 MongoDB의 제한을 극복할 수 있습니다. $또는..

Mongoose 게터 및 세터를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

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

스택 오버플로에 대한 6개 변경 제한으로 인해 원본을 변경할 수 없습니다. 다시 게시된 멋진 작업 톰은 캐치 블록에서 캐치(err)를 놓치고 있었습니다.

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

우리는 구조를 유지하고 스트링을 하지 않을 필요가 있었기 때문에 이를 처리하기 위해 다음과 같은 방법을 생각해 냈습니다.

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
}

언급URL : https://stackoverflow.com/questions/17497875/storing-json-object-in-mongoose-string-key

반응형