Мангуст конвертировать документы в формат JSON
Я вернул документы мангуста как 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'
}
8 ответов:
вы также можете попробовать 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); });Edit: Feb 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'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, а не Мангуст. Вот мой тест:
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.прототип из документа. Но это не имеет никакого значения в JSON.преобразовать в строки(док). И это не нужно в данном случае.
может быть, немного сбиться с пути к ответу, но если кто-то хочет сделать наоборот, вы можете использовать
Model.hydrate()(начиная с мангуста v4) для преобразования объекта javascript (JSON) в документ мангуста.полезное дело будет, когда вы используете
Model.aggregate(...). Поскольку он фактически возвращает простой объект JS, поэтому вы можете преобразовать его в документ мангуста, чтобы получить доступ кModel.method(например, ваше виртуальное свойство, определенное в схеме).PS. Я так и думал должен иметь поток, работающий как"конвертировать json в Mongoose docs", но на самом деле нет, и так как я узнал ответ, поэтому я думаю, что нехорошо делать self-post-and-self-answer.
вы можете использовать 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)); }
Comments