猫鼬发现与对象的属性完全匹配 100%

Mongoose find exactly match 100% with properties of object

我目前正在为我的项目使用 mongoose,我使用 mongoose find 来查询与我在对象中定义的内容 100% 完全匹配的文档。这是我的路由器定义:

router.get('/warned-students/:classname/:schoolYear/:semester', get_warned_students)

这是我输入的link:

http://localhost:5000/students/warned-students/k61caclc1/2016/1

如你所见,它收到了 3 个参数类名、学年和学期。 classname 是 k61clc1,choolYear 是 2016,semester 是 1.

这是我的控制器

const Student = require('../models/student')

exports.get_warned_students = (req, res, next) => {
  const { classname, schoolYear, semester } = req.params

  Student.find({
    classname,
    'accademicTrainningList.schoolYear': schoolYear,
    'accademicTrainningList.semester': semester,
    'accademicTrainningList.classification': 'Weak'
  })
    .exec()
    .then(students => {
      res.status(200).json({ size: students.length, students })
    })
    .catch(err => {
      console.log('error in finding warned students')
      res.status(500).json({ err })
    })
}

它起作用了,但不是 return 我所期望的:

{
    "size": 14,
    "students": [
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e1b",
            "fullname": "Trịnh Phan Anh ",
            "birthday": "19/09/1997 ",
            "classname": "k61caclc1",
            "code": "16020508",
            "vnumail": "16020508@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9dc0",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fea9",
                    "score": 53,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e1e",
            "fullname": "Đinh Việt Cường ",
            "birthday": "13/03/1996 ",
            "classname": "k61caclc1",
            "code": "16022255",
            "vnumail": "16022255@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9dc3",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feac",
                    "score": 56,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e23",
            "fullname": "Phạm Duy ",
            "birthday": "17/12/1998 ",
            "classname": "k61caclc1",
            "code": "16020542",
            "vnumail": "16020542@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Excellent",
                    "_id": "5f603a126d633e75884e9dc8",
                    "score": 90,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feb1",
                    "score": 56,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e26",
            "fullname": "Đặng Ngọc Đam ",
            "birthday": "26/11/1998 ",
            "classname": "k61caclc1",
            "code": "16020518",
            "vnumail": "16020518@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9dcb",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feb4",
                    "score": 55,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e28",
            "fullname": "Nguyễn Hải Đăng ",
            "birthday": "09/08/1998 ",
            "classname": "k61caclc1",
            "code": "16020520",
            "vnumail": "16020520@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9dcd",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feb6",
                    "score": 56,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e29",
            "fullname": "Nguyễn Hải Đăng ",
            "birthday": "24/11/1998 ",
            "classname": "k61caclc1",
            "code": "16020519",
            "vnumail": "16020519@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Excellent",
                    "_id": "5f603a126d633e75884e9dce",
                    "score": 90,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feb7",
                    "score": 54,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e2b",
            "fullname": "Đỗ Hồng Giang ",
            "birthday": "29/01/1997 ",
            "classname": "k61caclc1",
            "code": "16020544",
            "vnumail": "16020544@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9dd0",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feb9",
                    "score": 57,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e36",
            "fullname": "Phạm Minh Hiếu ",
            "birthday": "17/10/1998 ",
            "classname": "k61caclc1",
            "code": "16020373",
            "vnumail": "16020373@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9ddb",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fec4",
                    "score": 55,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e38",
            "fullname": "Nguyễn Ngọc Hòa ",
            "birthday": "29/04/1997 ",
            "classname": "k61caclc1",
            "code": "16020566",
            "vnumail": "16020566@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9ddd",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fec6",
                    "score": 57,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e3b",
            "fullname": "Trần Hữu Hoàn ",
            "birthday": "25/11/1998 ",
            "classname": "k61caclc1",
            "code": "16022471",
            "vnumail": "16022471@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9de0",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fec9",
                    "score": 59,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e3e",
            "fullname": "Nguyễn Tấn Hoàng ",
            "birthday": "06/01/1998 ",
            "classname": "k61caclc1",
            "code": "16022261",
            "vnumail": "16022261@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9de3",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fecc",
                    "score": 50,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e47",
            "fullname": "Nguyễn Trung Kiên ",
            "birthday": "18/09/1998 ",
            "classname": "k61caclc1",
            "code": "16020588",
            "vnumail": "16020588@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Intermediate",
                    "_id": "5f603a126d633e75884e9dec",
                    "score": 75,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fed5",
                    "score": 55,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e52",
            "fullname": "Nguyễn Văn Mạnh ",
            "birthday": "07/07/1998 ",
            "classname": "k61caclc1",
            "code": "16020606",
            "vnumail": "16020606@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9df7",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6fee0",
                    "score": 59,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },
        {
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e60",
            "fullname": "Tạ Văn Quỳnh ",
            "birthday": "06/12/1998 ",
            "classname": "k61caclc1",
            "code": "16020637",
            "vnumail": "16020637@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Good",
                    "_id": "5f603a126d633e75884e9e05",
                    "score": 80,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Weak",
                    "_id": "5f603b1f3bd07d5cb4d6feee",
                    "score": 59,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        }
    ]
}

如您所见,returns 结果包含 3 个属性中的 1 个,但我想要的是 returns 仅包含所有 3 个属性的结果。谢谢你帮助我,祝你有美好的一天 更新:

这是我所期望的:数组“accademicTrainningList”包含一个适合所有 3 属性 学年:2016,学期:1 和分类:弱

的元素
{
            "gender": "No Record",
            "profileImage": "https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg",
            "_id": "5f603a126d633e75884e9e1b",
            "fullname": "Trịnh Phan Anh ",
            "birthday": "19/09/1997 ",
            "classname": "k61caclc1",
            "code": "16020508",
            "vnumail": "16020508@vnu.edu.vn",
            "accademicTrainningList": [
                {
                    "semester": "1",
                    "classification": "Weak",
                    "_id": "5f603a126d633e75884e9dc0",
                    "score": 53,
                    "schoolYear": "2016"
                },
                {
                    "semester": "2",
                    "classification": "Good",
                    "_id": "5f603b1f3bd07d5cb4d6fea9",
                    "score": 80,
                    "schoolYear": "2016"
                }
            ],
            "scoreList": [],
            "receiveScholarship": [],
            "prizeList": [],
            "scienceContestPrizeList": [],
            "wentAbroad": [],
            "tookTheTest": [],
            "punishList": [],
            "__v": 0
        },

否则,如果没有匹配项 return 一个空数组

看来 $elemMatch 正是您所需要的。在您的情况下,查询将类似于:

Student.find({
  classname: "k61caclc1",
  accademicTrainningList: {
    $elemMatch: {
      semester: "1",
      schoolYear: "2016",
      classification: "Weak"
    }
  }
})

Mongo Playground