我是 MongoDB 的新手,并试图将两个查询合并并将结果存储在一个模型中。我想在获取客户端任务时从另一个集合中获取客户端名称。
型号:-
const mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
const ClientTaskSchema = new mongoose.Schema({
clientId: {
type: Number
},
taskId: {
type: Number
},
clientTaskId: {
type: Number
},
active: {
type: Boolean
}
});
module.exports = mongoose.model('ClientTask', ClientTaskSchema);
控制器:-
module.exports.getClientByTask = function(req, res) {
var query = url.parse(req.url,true).query;
ClientTask.find({taskId: query.taskId}, function(err, clientTask) {
if (err) throw err;
if (!clientTask) {
res.status(200).json({ success: false, message: 'Somthing went wrong. Please contact admin.'});
}
else {
res.status(200).json({ success: true, message: 'Successfull', data: clientTask});
}
});
};
答案 0 :(得分:1)
一种选择是传递clientId
作为参考:
clientId: {
type: mongoose.Schema.Types.ObjectId, ref: 'Client / or whatever your model'
}
然后,您将能够使用Mongoose的populate
方法http://mongoosejs.com/docs/populate.html
ClientTask
.find({ taskId: query.taskId })
.populate('clientId', { name: 1 }).exec(function (err, clientTask) {
if (!clientTask) {
res.status(404).json({ message: 'Client task not found' })
}
// your logic
});
答案 1 :(得分:0)
您可以使用mongodb聚合来获取聚合数据。要计算集合中数据的汇总值:
$ lookup对同一数据库中未分片的集合执行左外部联接,以过滤“联接”集合中的文档以进行处理。在每个输入文档中,$ lookup阶段都会添加一个新的数组字段,其元素是“ joined”集合中的匹配文档。 $ lookup阶段将这些经过重整的文档传递到下一个阶段。
您的情况:
Model.ClientTask.aggregate([
{
$lookup:
{
from: "client",
localField: "_id",
foreignField: "clientId",
as: "clientData"
},
},
{
$project: {
"name": clientData.name, // This name will be client name from client collections
"taskId": 1,
"clientTaskId": 1,
"active": 1
}
}
],
function (err, response) {
console.log(err, response)
});