web-dev-qa-db-ja.com

MongooseドキュメントをJSONに変換する

次のようにして、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'
}
60
Trantor Liu

Mongoosejsの lean() を試すこともできます:

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

遅い答えですが、スキーマを定義するときにこれを試すこともできます。

/**
 * 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());
        }
    });
46
eAbi

まず、toObject()の代わりにtoJSON()を試してください。

第二に、配列ではなく実際のドキュメントで呼び出す必要があるので、次のようなもっと面倒なことを試してみてください。

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

推測ですが、役立つと思います

24
Jamund Ferguson
model.find({Branch:branch},function (err, docs){
  if (err) res.send(err)

  res.send(JSON.parse(JSON.stringify(docs)))
});
12
Fabio Guerra

私は間違いを犯したことがわかりました。 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)では違いはありません。この場合は必要ありません。

6
Trantor Liu

少し答えに迷うかもしれませんが、逆のことをしようとしている人は、Model.hydrate()(mongoose v4以降)を使用してjavascriptオブジェクト(JSON)をmongooseドキュメントに変換できます。

有用なケースは、Model.aggregate(...)を使用する場合です。実際にはプレーンなJSオブジェクトを返しているため、Model.method(例:スキーマで定義された仮想プロパティ)。

PS。 「Convert json to Mongoose docs」のようなスレッドを実行する必要があると思いましたが、実際にはそうではなく、答えを見つけたので、セルフポストを行うのは良くないと思います-および自己回答。

2
Leo Li

Res.json()を使用して、任意のオブジェクトをjson化できます。 lean()は、mongooseクエリの空のフィールドをすべて削除します。

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

1
bindaas

このオプションを試してください:

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

それは私のために働いた:

Products.find({}).then(a => console.log(a.map(p => p.toJSON())))


また、ゲッターを使用する場合は、スキーマを定義する際にそのオプションも追加する必要があります。

new mongoose.Schema({...}, {toJSON: {getters: true}})

0
yaya