次のようにして、mongooseドキュメントをjsonとして返しました。
UserModel.find({}, function (err, users) {
return res.end(JSON.stringify(users));
}
ただし、user .__ 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モデルのインスタンスではないことに注意してください。 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());
}
});
まず、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__は、mongooseではなく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からdoc.prototypeを削除します。ただし、JSON.stringify(doc)では違いはありません。この場合は必要ありません。
少し答えに迷うかもしれませんが、逆のことをしようとしている人は、Model.hydrate()
(mongoose v4以降)を使用してjavascriptオブジェクト(JSON)をmongooseドキュメントに変換できます。
有用なケースは、Model.aggregate(...)
を使用する場合です。実際にはプレーンなJSオブジェクトを返しているため、Model.method
(例:スキーマで定義された仮想プロパティ)。
PS。 「Convert json to Mongoose docs」のようなスレッドを実行する必要があると思いましたが、実際にはそうではなく、答えを見つけたので、セルフポストを行うのは良くないと思います-および自己回答。
Res.json()を使用して、任意のオブジェクトを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));
}
それは私のために働いた:
Products.find({}).then(a => console.log(a.map(p => p.toJSON())))
また、ゲッターを使用する場合は、スキーマを定義する際にそのオプションも追加する必要があります。
new mongoose.Schema({...}, {toJSON: {getters: true}})