我以这种方式将jongoose docs作为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'
}
答案 0 :(得分:119)
您也可以尝试mongoosejs的lean():
UserModel.find().lean().exec(function (err, users) {
return res.end(JSON.stringify(users));
}
答案 1 :(得分:44)
迟到的答案,但您也可以在定义架构时尝试此操作。
/**
* 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模型的实例。你可以在对象哈希上操作,没有getter / setter。
然后:
Model
.findById(modelId)
.exec(function (dbErr, modelDoc){
if(dbErr) return handleErr(dbErr);
return res.send(modelDoc.toJSON(), 200);
});
编辑:2015年2月
因为我没有提供缺少的toJSON(或toObject)方法的解决方案,所以我将解释我的用法示例和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());
}
});
答案 2 :(得分:23)
首先,尝试toObject()
而不是toJSON()
?
其次,你需要在实际的文档而不是数组上调用它,所以也许尝试更烦人的东西:
var flatUsers = users.map(function() {
return user.toObject();
})
return res.end(JSON.stringify(flatUsers));
这是一个猜测,但我希望它有所帮助
答案 3 :(得分:12)
model.find({Branch:branch},function (err, docs){
if (err) res.send(err)
res.send(JSON.parse(JSON.stringify(docs)))
});
答案 4 :(得分:6)
我发现我犯了一个错误。根本不需要调用toObject()或toJSON()。问题中的__proto__来自jquery,而不是mongoose。这是我的测试:
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)中没有任何区别。在这种情况下不需要它。
答案 5 :(得分:2)
对于答案可能有点误入歧途,但如果有人想要反过来做,你可以使用Model.hydrate()
(因为mongoose v4)将javascript对象(JSON)转换为mongoose文档。
使用Model.aggregate(...)
时会有一个有用的案例。因为它实际上是返回纯JS对象,所以您可能希望将其转换为mongoose文档以访问Model.method
(例如,在模式中定义的虚拟属性)。
PS。我认为它应该有一个像" 将json转换为Mongoose docs "的线程,但实际上没有,因为我已经找到了答案,所以我认为它做自我回答和自我回答是不好的。
答案 6 :(得分:1)
您可以使用res.json()来jsonify任何对象。 lean()将删除mongoose查询中的所有空字段。
UserModel.find().lean().exec(function (err, users) {
return res.json(users);
}
答案 7 :(得分:1)
尝试以下选项:
UserModel.find({}, function (err, users) {
return res.end( JSON.parse(JSON.stringify(users)) );
//Or:
//return JSON.parse(JSON.stringify(users));
}
答案 8 :(得分:0)
对我有用:
Products.find({}).then(a => console.log(a.map(p => p.toJSON())))
如果您还想使用吸气剂,还应该添加它的选项(在定义模式时):
new mongoose.Schema({...}, {toJSON: {getters: true}})