对于普通查询运算符而言,您要执行的操作太复杂了。因此,您需要使用可以在查询中执行任意 JavaScript的$where 运算符。它带有警告和限制,因此如果需要检查大量匹配排列,它可能会非常慢。
一个可能有帮助的建议是创建一个单独的集合,其中文档是您的个人或先决条件列表。该集合将代表所有类的所有先决条件。例如:
{_id: ObjectId("50fe0f437f774e8013000001"),
prereq: ["English", "Literature", "Language"]},
{_id: ObjectId("50fe0f437f774e8013000002"),
prereq: ["Chemistry"]},
{_id: ObjectId("50fe0f437f774e8013000003"),
prereq: ["Methods","Specialist Maths"]},
...
课程本身将指向先决条件的 ObjectId,而不是实际值。查询将分两步进行。首先找到与输入主题匹配的所有先决条件。
db.preReqCollection.find({prereq: {$in: inputSubjectList})
==> matchingPreReqList (the List of ObjectIds from preReqCollection met by inputSubjectList)
然后使用更简单的$where operator
查询来检查课程先决条件是否在matchingPreReqList
.