Converter mongoose docs para json

Eu retornei mongoose docs como json desta forma:

UserModel.find({}, function (err, users) { return res.end(JSON.stringify(users)); } 

No entanto, o usuário .__ proto__ também foi retornado. Como posso voltar sem isso? Eu tentei isso, mas não funcionou:

 UserModel.find({}, function (err, users) { return res.end(users.toJSON()); // has no method 'toJSON' } 

Você também pode tentar o lean de mongoosejs () :

 UserModel.find().lean().exec(function (err, users) { return res.end(JSON.stringify(users)); } 

Resposta tardia, mas você também pode tentar isso ao definir seu esquema.

 /** * toJSON implementation */ schema.options.toJSON = { transform: function(doc, ret, options) { ret.id = ret._id; delete ret._id; delete ret.__v; return ret; } }; 

Observe que ret é o object JSON’ed e não é uma instância do modelo do mangusto. Você operará corretamente em hashes de objects, sem getters / setters.

E depois:

 Model .findById(modelId) .exec(function (dbErr, modelDoc){ if(dbErr) return handleErr(dbErr); return res.send(modelDoc.toJSON(), 200); }); 

Editar: fevereiro de 2015

Como não forneci uma solução para os methods jSON (ou toObject) ausentes, explicarei a diferença entre meu exemplo de uso e o exemplo de uso do OP.

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

Meu exemplo:

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

Primeiro de tudo, tente toObject() vez de toJSON() talvez?

Em segundo lugar, você precisará chamá-lo nos documentos reais e não no array, então talvez tente algo mais irritante assim:

 var flatUsers = users.map(function() { return user.toObject(); }) return res.end(JSON.stringify(flatUsers)); 

É um palpite, mas espero que ajude

 model.find({Branch:branch},function (err, docs){ if (err) res.send(err) res.send(JSON.parse(JSON.stringify(docs))) }); 

Eu descobri que cometi um erro. Não há necessidade de chamar toObject () ou toJSON (). O __proto__ na questão veio de jquery, não de mangusto. Aqui está meu teste:

 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 () remove doc.prototype de um documento. Mas isso não faz diferença em JSON.stringify (doc). E não é necessário neste caso.

Talvez um pouco perdido para a resposta, mas se alguém estiver querendo fazer o contrário, você pode usar o Model.hydrate() (desde o mongoose v4) para converter um object javascript (JSON) em um documento do mongoose.

Um caso útil seria quando você usa Model.aggregate(...) . Porque ele está realmente retornando o object JS simples, então você pode querer convertê-lo em um documento do mongoose para obter access ao Model.method (por exemplo, sua propriedade virtual definida no esquema).

PS. Eu pensei que deveria ter um thread rodando como ” Converte json para mongoose docs “, mas na verdade não, e desde que eu descobri a resposta, então eu acho que não é bom fazer self-post-and-self-answer.

Você pode usar res.json () para jsonify qualquer object. lean () irá remover todos os campos vazios na consulta do mangusto.

UserModel.find().lean().exec(function (err, users) { return res.json(users); }

Experimente estas opções:

  UserModel.find({}, function (err, users) { return res.end( JSON.parse(JSON.stringify(users)) ); //Or: //return JSON.parse(JSON.stringify(users)); } 
    Intereting Posts