Node.js 用另一个查询对象扩充查询对象
尝试将mongoose查询中的两个结果对象合并为一个对象。 为什么这不起作用?有没有办法让这一切顺利进行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
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})
是的,这就是我以前的做法。不漂亮,但可以。非常感谢。