MongoDB использует $ lookup, $ unwind, $ match для поиска - PullRequest
1 голос
/ 14 марта 2020

В моем mongodb есть 2 сборника с именами "учитель" и "курс", а структуры как показано ниже

учитель

    {
        "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 Ответ

2 голосов
/ 14 марта 2020

Попробуйте это:

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. Дайте мне знать, если это решение соответствует вашим требованиям

...