Convertir Mangouste docs en json
J'ai retourné mongoose docs comme json de cette façon:
UserModel.find({}, function (err, users) {
return res.end(JSON.stringify(users));
}
Cependant, utilisateur.__ proto_ _ a également été retourné. Comment puis-je retourner, sans elle? J'ai essayé cela mais pas travaillé:
UserModel.find({}, function (err, users) {
return res.end(users.toJSON()); // has no method 'toJSON'
}
8 réponses
Vous pouvez également essayer Lean de mongoosejs() :
UserModel.find().lean().exec(function (err, users) {
return res.end(JSON.stringify(users));
}
Réponse tardive mais vous pouvez également essayer ceci lors de la définition de votre schéma.
/**
* toJSON implementation
*/
schema.options.toJSON = {
transform: function(doc, ret, options) {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
return ret;
}
};
Notez que ret est l'objet JSON'ED, et ce n'est pas une instance du modèle mongoose. Vous allez l'opérer directement sur les hachages d'objets, sans getters / setters.
Puis:
Model
.findById(modelId)
.exec(function (dbErr, modelDoc){
if(dbErr) return handleErr(dbErr);
return res.send(modelDoc.toJSON(), 200);
});
Modifier: Février 2015
Parce que je n'ai pas fourni de solution aux méthodes tojson (ou toObject) manquantes, je vais expliquer la différence entre mon exemple d'utilisation et L'utilisation D'OP exemple.
OP:
UserModel
.find({}) // will get all users
.exec(function(err, users) {
// supposing that we don't have an error
// and we had users in our collection,
// the users variable here is an array
// of mongoose instances;
// wrong usage (from OP's example)
// return res.end(users.toJSON()); // has no method toJSON
// correct usage
// to apply the toJSON transformation on instances, you have to
// iterate through the users array
var transformedUsers = users.map(function(user) {
return user.toJSON();
});
// finish the request
res.end(transformedUsers);
});
Mon Exemple:
UserModel
.findById(someId) // will get a single user
.exec(function(err, user) {
// handle the error, if any
if(err) return handleError(err);
if(null !== user) {
// user might be null if no user matched
// the given id (someId)
// the toJSON method is available here,
// since the user variable here is a
// mongoose model instance
return res.end(user.toJSON());
}
});
Tout d'Abord, essayez de toObject() au lieu de toJSON() peut-être?
Deuxièmement, vous devrez l'appeler sur les documents réels et non sur le tableau, alors essayez peut-être quelque chose de plus ennuyeux comme ceci:
var flatUsers = users.map(function() {
return user.toObject();
})
return res.end(JSON.stringify(flatUsers));
C'est une supposition, mais j'espère que ça aide
model.find({Branch:branch},function (err, docs){
if (err) res.send(err)
res.send(JSON.parse(JSON.stringify(docs)))
});
J'ai découvert que j'avais fait une erreur. Il n'est pas nécessaire d'appeler toObject () ou toJSON () du tout. Le _ _ proto__ dans la question est venu de jquery, pas de mangouste. Voici mon test:
UserModel.find({}, function (err, users) {
console.log(users.save); // { [Function] numAsyncPres: 0 }
var json = JSON.stringify(users);
users = users.map(function (user) {
return user.toObject();
}
console.log(user.save); // undefined
console.log(json == JSON.stringify(users)); // true
}
Doc.toObject () supprime doc.prototype à partir d'un doc. Mais cela ne fait aucune différence dans JSON.stringify (doc). Et ce n'est pas nécessaire dans ce cas.
Peut-être un peu égaré par la réponse, mais si quelqu'un cherche à faire l'inverse, vous pouvez utiliser Model.hydrate() (depuis mongoose v4) pour convertir un objet javascript (JSON) en un document mongoose.
Un cas utile serait lorsque vous utilisez Model.aggregate(...). Parce qu'il retourne en fait un objet JS simple, vous pouvez donc le convertir en un document mongoose afin d'avoir accès à Model.method (par exemple, votre propriété virtuelle définie dans le schéma).
PS. Je pensais qu'il devrait avoir un fil courir comme " Convert JSON to Mongoose docs ", mais en fait pas, et puisque j'ai trouvé la réponse, donc je pense qu'il n'est pas bon de faire auto-post-et-auto-réponse.
Vous pouvez utiliser res. json () pour jsonifier n'importe quel objet. lean () supprimera tous les champs vides de la requête mongoose.
UserModel.find().lean().exec(function (err, users) {
return res.json(users);
}
Essayez cette option:
UserModel.find({}, function (err, users) {
return res.end( JSON.parse(JSON.stringify(users)) );
//Or:
//return JSON.parse(JSON.stringify(users));
}