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.
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.
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,
..
});
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);
}
}
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);
}
}
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
}