【问题标题】:How to apply condition on second collection using aggregrate and $lookup in mongodb如何在 mongodb 中使用聚合和 $lookup 对第二个集合应用条件
【发布时间】:2018-01-31 16:36:04
【问题描述】:

我完全被 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' });
            }
        })   
});

这是我的代码。这里的医院是我的第一个系列,最喜欢的是我的第二个系列。我想在第二个集合上添加一个条件。对于第一个集合,我的代码运行良好,但不适用于第二个集合。还有一些注释行也显示了我的第二个集合的条件。如果您有任何解决方案,请回复。

【问题讨论】:

  • 条件查找中没有localField foreignField。检查docs.mongodb.com/manual/reference/operator/aggregation/lookup/…的语法。
  • 您不需要使用查找的管道变体。在 $lookup 之后添加 $unwind & $match 以在第二个集合上应用标准。类似{ "$lookup": { "localField": "_id", "from": "favorites", "foreignField": "hospital_id", "as": "datafind" } } , {"$unwind":"$datafind"}, {"$match":{"datafind.user_id":mongoose.Types.ObjectId(req.body.user_id)}}

标签: javascript mongodb aggregation-framework mean-stack


【解决方案1】:

我会尝试使用放松、比赛、小组赛来获得你需要的结果:

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 引入了有助于查找的条件,但仍保留在您的数据库版本上。

【讨论】:

  • 如果您想拥有原始文档数量,则小组阶段是可选的,因为您将根据收藏夹增加结果数量,例如3 家医院 * 10 个收藏夹 = 没有 $group 的聚合后的 30 个文档。
猜你喜欢
  • 2021-02-22
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2020-07-12
  • 2019-01-21
  • 2021-08-15
相关资源
最近更新 更多