MongoDB使用$ lookup,$ unwind,$ match搜索

时间:2020-03-14 10:08:05

标签: mongodb aggregation-framework

我的mongodb中有两个集合,分别是“ teacher”和“ course”,结构如下所示:

老师

    {
        "rating": 4,
        "teacher_id": "123",
        "course_count": 1,
    },
    {
        "rating": 5,
        "teacher_id": "456",
        "course_count": 4,
    }

课程

    {
        "teacher_id": "123",
        "advanced": true,
    },
    {
        "teacher_id": "456",
        "advanced": false,
    }

我要搜索的是哪门课程的老师教授少于2门课程,而该课程的高级课程为True。

我想要的结果

    {
        "teacher_id": "123",
        "advanced": true,
    }

我尝试过

db.getCollection('course').aggregate([
    {"$limit": 10 },
    { "$lookup" : {
        "localField": "teacher_id" ,
        "from": "teacher" ,
        "foreignField": "teacher_id" ,
        "as": "teacher"
    }},
    {"$unwind": {path: '$teacher', preserveNullAndEmptyArrays: true}},
    {'$match': {
        'advanced': true,
        'teacher.course_count': {'$lt': 2}
    }}
])

但是似乎没有用,有人可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:2)

尝试这个:

db.course.aggregate([
  {
    "$match": {
      "advanced": true
    }
  },
  {
    "$lookup": {
      "from": "teacher",
      "localField": "teacher_id",
      "foreignField": "teacher_id",
      "as": "teacher"
    }
  },
  {
    "$match": {
      "teacher.course_count": {
        "$lt": 2
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "advanced": 1,
      "teacher_id": 1
    }
  },
  {
    "$limit": 10
  }
])

MongoPlayground

注意:如果您需要访问teacher数组内容,则可以使用$unwind + $project$let运算符。让我知道此解决方案是否满足您的要求

相关问题