首页 > 解决方案 > MongoDB 使用 $lookup、$unwind、$match 进行搜索

问题描述

我的 mongodb 中有 2 个集合,名为“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}
    }}
])

但它似乎不起作用,任何人都可以帮助我吗?谢谢!

标签: mongodbaggregation-framework

解决方案


试试这个:

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
  }
])

Mongo游乐场

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


推荐阅读