web-dev-qa-db-fra.com

Stockage d'un objet Json dans la clé Mongoose String

Dans mon schéma Mongoose, j'ai un champ qui est une chaîne et je veux pouvoir y stocker un objet JSON. C'est possible? Dans Postgres, il est possible de stocker un dictionnaire dans une colonne de chaîne. 

Je souhaite le faire car le dictionnaire (en fait, un objet JSON dans JS) n’est qu’une simple valeur de lecture et d’écriture et n’a pas besoin de requêtes, mais aussi parce qu’il ne s’agit que d’une valeur et non d’un tableau de valeurs.

27
Saransh Mohapatra

Oui, vous pouvez simplement stocker {myJsonProperty: JSON.stringify(myObject)}. Espérons que vous savez que vous pouvez également simplement définir {myJsonProperty: Object} dans votre schéma mangouste et stocker l'objet entier sans le convertir en chaîne sans raison. Il ne doit pas s'agir d'un document imbriqué avec un schéma, il peut s'agir simplement d'un simple objet javascript.

82
Peter Lyons

si vous pouvez changer le type de votre champ "String" en "Object", vous pouvez enregistrer le JSON tel quel.

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

La réponse acceptée est bonne pour la majorité des situations.

Toutefois, si vous souhaitez stocker un objet et que vous n’avez aucun contrôle sur les clés d’objet (par exemple, elles peuvent être soumises par l’utilisateur), vous pouvez envisager de les stocker sous forme de code JSON codé. Cela vous permet de surmonter la limitation imposée par MongoDB selon laquelle les clés ne doivent pas contenir les caractères réservés$ ou ..

Vous pouvez y parvenir en utilisant les getters et les setters Mongoose, par exemple:

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

Impossible de modifier l'original en raison de la limite de 6 modifications du débordement de pile. ré-posté, excellent travail Tom, manquait tout simplement catch (err) dans le bloc catch

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

Nous avions besoin de conserver la structure et de ne pas créer de chaîne. J'ai donc proposé les méthodes suivantes pour gérer cela:

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
}
1
MichaelWClark