Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 用另一个查询对象扩充查询对象_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js 用另一个查询对象扩充查询对象

Node.js 用另一个查询对象扩充查询对象,node.js,mongodb,express,mongoose,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 }, functi

尝试将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"
        })
    })
}
不允许添加属性。您需要在调用exec()之前调用该方法,因为从启用精益选项的查询返回的文档是纯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
        })
    })
}
不允许添加属性。您需要在调用exec()之前调用该方法,因为从启用精益选项的查询返回的文档是纯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
        })
    })
}

刚刚发现,项目模型中定义的虚拟现实不再以这种方式工作。有人会期望它们被“实现”到querries返回的对象中,但事实似乎并非如此。有解决方法吗?我不知道是否有解决方法,因为正如mongoose文档所描述的,使用lean选项true查询返回的文档是纯javascript对象,而不是mongoose文档。它们没有保存方法、getter/setter或其他Mongoose魔法,就像虚拟现实一样应用,所以您可能会遇到难题。您可以创建一个包含两个键的包装对象,这两个键保存Mongoose文档,并将其发送到客户端,例如,
res.send({“project”:project,“client”:client})
是的,这就是我以前的做法。不漂亮,但可以。非常感谢。刚刚发现,项目模型中定义的虚拟现实不再以这种方式工作。有人会期望它们被“实现”到querries返回的对象中,但事实似乎并非如此。有解决方法吗?我不知道是否有解决方法,因为正如mongoose文档所描述的,使用lean选项true查询返回的文档是纯javascript对象,而不是mongoose文档。它们没有保存方法、getter/setter或其他Mongoose魔法,就像虚拟现实一样应用,所以您可能会遇到难题。您可以创建一个包含两个键的包装对象,这两个键保存Mongoose文档,并将其发送到客户端,例如,
res.send({“project”:project,“client”:client})
是的,这就是我以前的做法。不漂亮,但可以。非常感谢。