如何在mongodb中使用聚合和$ lookup在第二次收集上应用条件

时间:2018-01-31 16:36:05

标签: javascript mongodb aggregation-framework mean-stack

我完全陷入了MEAN Js的一个条件。我在下面写了我的代码:

apiRouter.post('/findhospitalbyname', function(req, res) {

    Hospital.aggregate([
    {
        "$match":{
        title: { '$regex': '.*' + req.body.name + '.*', $options: 'i' }
        }
    },
    {   
        "$lookup": {  
            "localField": "_id",   
            "from": "favorites",         
            "foreignField": "hospital_id", 
       // "pipeline": [{ 
       //    "$match": {"user_id": mongoose.Types.ObjectId(req.body.user_id)}
       //  }],
            "as": "datafind"  
        } 
  } 
],   
function(err, hospital) {
            if (err) {
                return res.send({ 'user_data': err, 'error': 1 });
            }
            if (hospital.length != 0) {
                return res.send({ 'data': hospital, 'error':0});
            } else {
                return res.send({ 'data': '', 'error':2, 'msg': 'No data found' });
            }
        })   
});

这是我的代码。这里医院是我的第一个系列,最喜欢的是我的第二个系列。我想在第二次收集时添加一个条件。对于第一次收集我的代码工作正常,但它不适用于第二个集合。还有一些注释行显示我的第二个集合条件。如果您有任何解决方案,请回复。

1 个答案:

答案 0 :(得分:0)

我将尝试使用展开,匹配,小组阶段来获得您需要的结果:

Hospital.aggregate([
{
    "$match":{
       title: { '$regex': '.*' + req.body.name + '.*', $options: 'i' }
    }
},
{   
    "$lookup": {  
        "from": "favorites",  
        "localField": "_id",        
        "foreignField": "hospital_id", 
        "as": "datafind"  
        } 
  },
  {
    "$unwind" : "$datafind"
  },
  { 
   "$match": {"$datafind.user_id": mongoose.Types.ObjectId(req.body.user_id)}
  },
  {
      $group: 
          {
              _id : "$_id" 
          }
  } 
],//the other code...

如果您想首先使用管道,您需要知道您的mongo数据库的版本,管道仅适用于v3.6 +,上述代码适用于v3.2 +。所以是mongo介绍和有用的条件查找,但仍保留在您的数据库版本。