【问题标题】:Using $match and $lookup to retrieve data使用 $match 和 $lookup 检索数据
【发布时间】:2018-06-18 11:36:45
【问题描述】:

我一直在尝试检索一些数据,但我不断收到错误消息。这是我的路线中的一个sn-p,请让我知道它有什么问题。 我正在尝试从集合 2 中获取 jobID,它由集合 1 中的类别表示。希望它有意义。

我收到此错误 UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:1):MongoError:需要'cursor'选项,除了带有解释参数的聚合

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

【问题讨论】:

  • 请发布 mongo 版本和错误
  • 数据库版本 v3.6.1
  • 我收到此错误 UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 1): MongoError: The 'cursor' option is required, except for aggregate with the explain argument
  • 请同时发布 npm ls mongoose 结果
  • 对不起,我没听懂。你是说猫鼬版吗?

标签: node.js mongodb angular mongoose


【解决方案1】:

MongoDB 在 3.6 中更改了聚合命令的工作方式。聚合现在需要一个游标。来自参考https://github.com/Mockgoose/Mockgoose/issues/32 让管道包含业务逻辑,那么下面可能会有所帮助

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

【讨论】:

  • 用这个模型你会怎么写上面的sn-p?
  • mognoose 提供了 3 种查询方式。使用回调、承诺和事件光标。随意写任何风格
【解决方案2】:

帮助您调试的几个解决方案:

首先,设置一个 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);
}); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多