使用$ match和$ lookup来检索数据

时间:2018-01-09 12:19:42

标签: node.js mongodb angular mongoose

我一直试图检索一些数据,但我一直收到错误。这是我路线的片段,请告诉我它有什么问题。 我正试图从集合2获得jobID,它由集合1中的类别表示。希望它有意义。

我收到此错误 UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):MongoError:'cursor'选项是必需的,除了带有explain参数的聚合

router.get('/jobs/:type', (req, res, next)=>{
   Job.aggregate([
       { $match : { category: req.params.type, "bidcounter": { $gt:-1, $lt:5} } },
       {
           $lookup:
             {
               from: "job_cat",
               localField: "category",
               foreignField: "jobID",
               as: "product_cat"
             }
        }, { $sort : { date : -1} }
   ], function(err, jobs){
       res.json(jobs);
   });
});

2 个答案:

答案 0 :(得分:1)

一些帮助您调试的解决方案:

首先,设置一个promise库,让你能够.catch你的错误。

Adding promise library to mongoose

现在你可以这样做:

Job.aggregate([{
            $match: {
                category: req.params.type,
                "bidcounter": {
                    $gt: -1,
                    $lt: 5
                }
            }
        },
        {
            $lookup: {
                from: "job_cat",
                localField: "category",
                foreignField: "jobID",
                as: "product_cat"
            }
        }, {
            $sort: {
                date: -1
            }
        }
    ])
    .catch((err) => {
        //error, its handled now!
    })

要查看错误是什么,你可以做到这一点,但我记得在某处读过这不是最佳做法。

我过去曾经使用它,只看到我的错误来自哪里。

process.on('unhandledRejection', error => {

  console.log('unhandledRejection', error.message);
}); 

答案 1 :(得分:1)

MongoDB在3.6中更改了聚合命令的工作原理。聚合现在需要一个游标。来自参考https://github.com/Mockgoose/Mockgoose/issues/32 让管道包含业务逻辑,然后在下面可以帮助

 Job.aggregate(pipeline)
  .cursor({})
    .exec((err, results)=>{
    console.log(err, results)
    })