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