来自nodejs的MongoDB联接查询

时间:2018-07-27 12:23:36

标签: node.js mongodb

我是 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});
    }
});
};

2 个答案:

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