Ответ 1
Вы также можете попробовать mongoosejs lean():
UserModel.find().lean().exec(function (err, users) {
return res.end(JSON.stringify(users));
}
Я вернул mongoose 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'
}
Вы также можете попробовать 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, и это не экземпляр модели мангуста. Вы будете работать на нем прямо на хэшах объектов, без геттеров/сеттеров.
И затем:
Model
.findById(modelId)
.exec(function (dbErr, modelDoc){
if(dbErr) return handleErr(dbErr);
return res.send(modelDoc.toJSON(), 200);
});
Изменить: февраль 2015
Поскольку я не предоставлял решение отсутствующего метода 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 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, а не мангуста. Здесь мой тест:
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.prototype из документа. Но это не имеет никакого значения в JSON.stringify(doc). И это не нужно в этом случае.
Может быть, немного в заблуждении относительно ответа, но если кто-то хочет сделать наоборот, вы можете использовать Model.hydrate()
(начиная с mongoose v4), чтобы преобразовать объект javascript (JSON) в документ mongoose.
Полезный случай будет при использовании Model.aggregate(...)
. Поскольку он на самом деле возвращает простой JS-объект, вы можете преобразовать его в документ Mongoose, чтобы получить доступ к Model.method
(например, вашему виртуальному свойству, определенному в схеме).
PS. Я думал, что должен быть поток, работающий как "Преобразовать JSON в документы Mongoose", но на самом деле нет, и так как я нашел ответ, то я думаю, что это не очень хорошо делать пост-пост и-я-ответ.
Вы можете использовать res.json() для jsonify любого объекта. lean() удалит все пустые поля в запросе мангуста.
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));
}
У меня это сработало:
Products.find({}).then(a => console.log(a.map(p => p.toJSON())))
также, если вы хотите использовать геттеры, вы должны также добавить его опцию (при определении схемы):
new mongoose.Schema({...}, {toJSON: {getters: true}})