web-dev-qa-db-fra.com

Ajouter un nouvel attribut à un objet JSON existant dans node.js

J'ai un objet comme ça

==================records=========={ Id: 5114a3c21203e0d811000088,
  userId: 'test',
  sUserId: test,
  userName: 'test',
  url: 'test',
  Title: 'test'
}

J'ai besoin d'ajouter un nouveau champ Nom: 'test' à l'enregistrement ci-dessus, j'ai essayé de donner des enregistrements. Nom = nom, cela n'a pas fonctionné.

Aide s'il vous plaît

Merci, Prats

20
Prats

Ceux qui trouvent ce problème, OP a mentionné dans un commentaire ci-dessous la question initiale que la solution à ce problème est:

records.set('Name', 'test')

Ceci ajoute un nouvel attribut appelé Name ayant la valeur test.

10
Haywire

Je suppose que vous essayez d'ajouter une propriété à un document Mongoose renvoyé pour la réutiliser ailleurs. Les documents renvoyés par Mongoose ne sont pas directement des objets JSON, vous devez les convertir en objet pour leur ajouter des propriétés. Ce qui suit devrait fonctionner:

//... record is a mongoose Document
var r = record.toObject();
r.Name = 'test';
console.log("Record ",r);
44
droider

Juste utiliser,

var convertedJSON = JSON.parse(JSON.stringify(mongooseReturnedDocument);

et alors,

convertedJSON.newProperty = 'Hello!' 

'Bonjour!' peut être n'importe quoi, un nombre, un objet ou un littéral d'objet JSON.

À votre santé! :)

8
bombayquant

J'ai rencontré un problème similaire et j'espère que mes heures de frustration existentielle aideront les autres dans la même situation. J'avais tendance à croire que les documents renvoyés via Mongoose étaient en lecture seule. Ce n'est en fait pas vrai. 

Toutefois, vous ne pouvez pas affecter une propriété à votre document qui ne figure pas également dans votre schéma. 

Donc, à moins que votre schéma ait les caractéristiques suivantes: 

{
    Name: {String}
}

vous serez constamment frustré d'essayer d'attribuer un nom à votre document.

Maintenant, il existe des solutions de contournement dans les réponses ci-dessus qui ont également fonctionné pour moi, mais elles ne vont pas au fond du problème:

myDocument.toObject();
JSON.parse(JSON.stringify(myDocument);

Ceux-ci fonctionneront, mais à mon avis ils cachent juste le problème. Le vrai problème est que Mongoose est plus intelligent que nous ne le pensions et applique votre schéma, comme il se doit.

4
majorobot

Ma variante.

Si le schéma est défini avec {strict:false}, vous pouvez simplement ajouter une nouvelle propriété en

recorcd.newProp = 'newvalue';

Si le schéma est défini avec {strict:true}, vous pouvez convertir un objet Mongoose en objet comme indiqué précédemment ou utiliser la commande

record.set('newProp','newValue',{strict:false})

Voir http://mongoosejs.com/docs/api.html#document_Document-schema

1
venoel