我想基于用户提供的特定匹配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中应用此查询时,它无法正常工作并发送空数据。
请告诉我究竟是什么错误。
答案 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)
}
})
});
并且您不需要对请求参数进行字符串化。