将Mongoose docs转换为json

时间:2012-03-31 03:02:13

标签: json node.js object document mongoose

我以这种方式将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'
}

9 个答案:

答案 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}})