使用另一个查询对象扩充查询对象

时间:2016-06-24 11:14:29

标签: node.js mongodb express mongoose

尝试将来自mongoose查询的两个结果对象组合到一个对象中。 为什么这不起作用?任何想法如何使这项工作?

exports.get = function(req, res, err) {
    Project.findOne({
        _id: req.params.id
    }, function(err, project) {
        Client.findOne({
            _id: project.clientId
        }, function(err, client) {
            project.foo = "bar" // works
            project.client = client; // why is this not working?
            res.send(project); // object has property "foo" but no property "client"
        })
    })
}

1 个答案:

答案 0 :(得分:0)

Mongoose documents 不允许添加属性。您需要在 exec() 之前调用lean()方法,因为启用了精益选项的查询返回的文档是普通的javascript对象。

来自文档:

Project.find().lean().exec(function (err, project) {
    project[0] instanceof mongoose.Document // false
});

所以你的代码应该是这样的:

exports.get = function(req, res, err) {
    Project.findOne({ '_id': req.params.id })
           .lean()
           .exec(function(err, project) {
               Client.findOne({ '_id': project.clientId })
                     .lean()
                     .exec(function(err, client) {
                         project.foo = "bar" // works
                         project.client = client; // works
                         res.send(project); // object has both properties
                     });
           });
}

或将返回的文档强制转换为普通的JS对象:

exports.get = function(req, res, err) {
    Project.findOne({
        _id: req.params.id
    }, function(err, project) {
        Client.findOne({
            _id: project.clientId
        }, function(err, client) {
            var obj = project.toObject();
            obj.foo = "bar" // works
            obj.client = client; // works
            res.send(obj); // object has both properties
        })
    })
}