$ lookup在Node.js中不能与$ match一起使用

时间:2017-03-16 05:08:09

标签: node.js mongodb match lookup

我想基于用户提供的特定匹配ID来加入来自两个集合的文档。

用户集合的结构如下:

{
  "_id" : ObjectId("58946773ab022b192814b586"), 
  "name" : "Josef Rakicj", 
  "uId" : "1485936031178", 
  "email" : "xxx@gmail.com", 
  "type" : "Dealer", 
  "__v" : 0
}

广告收藏的结构如下:

{
  "_id" : ObjectId("58bfe1a6e809982168458a5e"), 
  "adId" : "1488970150316", 
  "uId" : "1485936031178",
  "title" : "Sorry, free.facebook.com isn't available in your country right now", 
  "type" : "0",
  "__v" : 0
}

因此,我尝试使用以下代码执行$lookup,在两个集合中执行$match

 router.get('/ad-details/:adId', function(req,res,next){ 
    var paramid=JSON.stringify(req.params.adId); 
    Adpost.aggregate(
      {$match:{adId:paramid}},
      { $lookup: 
        {
          from: "users",
          localField: "uId", 
          foreignField: "uId", 
          as: "postby "
        }
      },function(err,data){
        if(err){res.json(err)}
            else{
                res.json(data)
                console.log(data)
            }
    })
 });  

以上聚合在Mongo Shell中工作正常。但是,当我在Node.js中应用此查询时,它无法正常工作并发送空数据。

请告诉我究竟是什么错误。

1 个答案:

答案 0 :(得分:1)

聚合查询必须是一个数组,只需将查询放入数组

 router.get('/ad-details/:adId', function(req,res,next){ 
    Adpost.aggregate([{$match:{adId:req.params.adId}},{ $lookup: { from: "users",localField: "uId", foreignField: "uId", as: "postby "}}],function(err,data){
        if(err){res.json(err)}
            else{
                res.json(data)
                console.log(data)
            }
    })
 }); 

并且您不需要对请求参数进行字符串化。