将Mongoose文档转换为json

我以这种方式返回mongoose文件作为json:

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

但是,用户.__ proto__也被返回。 没有它,我怎么能回来? 我试过这个,但没有工作:

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

你也可以尝试mongoosejs的lean() :

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

迟到的答案,但你也可以尝试这个时候定义你的模式。

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

请注意ret是JSON的对象,它不是mongoose模型的一个实例。 你将在对象哈希上运行它,没有getters / setter。

接着:

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

编辑:2015年2月

因为我没有提供缺lesstoJSON(或toObject)方法的解决scheme,我将解释我的用法示例和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); }); 

我的例子:

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

首先,尝试toObject()而不是toJSON()也许?

其次,你需要在实际的文档而不是数组上调用它,所以也许尝试一些更恼人的事情是这样的:

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

这是一个猜测,但我希望它有帮助

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

我发现我犯了一个错误。 根本不需要调用toObject()或者toJSON()。 问题中的__proto__来自jquery,而不是mongoose。 这是我的testing:

 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()从doc中删除doc.prototype。 但是在JSON.stringify(doc)中没有区别。 在这种情况下不需要。

您可以使用res.json()来对任何对象进行裁切。 lean()将删除mongoose查询中的所有空字段。

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

试试这个选项:

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