我正在创建一个MERN应用程序,允许用户注册并将他们的技能保存到数据库中。我正在创建一个管理面板,允许我搜索用户的技能。在数据库中,用户的技能如下所示:
skills: [
{skill: 'React', yearsExperience: 3},
{skill: 'HTML', yearsExperience: 5},
{skill: 'JavaScript', yearsExperience: 5},
{skill: 'Git', yearsExperience: 3},
{skill: 'TypeScript', yearsExperience: 1},
{skill: 'C++', yearsExperience: 1}
]我使用OR查询来查询数据库,以撤回符合以下几个要求的用户(用户的用户在C方面的经验超过3年,或者在SQL方面的经验超过3年):
$or: [
{ skills: { $elemMatch: { skill: 'C', yearsExperience: { $gt: 3 } } } },
{ skills: { $elemMatch: { skill: 'SQL', yearsExperience: { $gt: 3 } } } },
];我的问题是,如何用一个名为percentageMatch的属性返回数组中的用户,该属性显示查询搜索到的匹配字段的数量?例如,如果Mark同时拥有超过3年的C和SQL经验,他的财产将说是100%,但是如果James只有3年或3年以上的SQL经验,而没有C经验的话,他的percentageMatching就会说50%。
// Response of match query
[
{
name: 'Mark',
skills: [...],
percentageMatch: 100%
},
{
name: 'James',
skills: [...],
percentageMatch: 50%
}
]发布于 2021-05-18 05:03:52
你可以用聚合来做,
$match$filter根据您的条件筛选数组并使用$addFields将其分配给matchingSkills$multiply,$divide得到百分比。这是代码
db.collection.aggregate([
{
"$match": { name: "mark" }
},
{
$addFields: {
matchingSkills: {
$filter: {
input: "$skills",
cond: {
$or: [
{
$and: [
{ $gt: [ "$$this.yearsExperience", 3 ] },
{ $eq: [ "$$this.skill", "HTML" ]}
]
},
{
$and: [
{ $gt: [ "$$this.yearsExperience", 3] },
{ $eq: [ "$$this.skill", "Git"] }
]
}
]
}
}
}
}
},
{
$addFields: {
matchingSkills: "$$REMOVE",
percentageMatch: {
$multiply: [
{ $divide: [ { $size: "$matchingSkills" }, 2 ]}, // yu already know how many values you need to pass, thats' why `2`
100
]
}
}
}
])Working 蒙戈游乐场
https://stackoverflow.com/questions/67580098
复制相似问题