javascript - 如何在 Mongoose/MongoDB 中将按最多匹配数排序的结果返回到最少?
问题描述
我正在 MEAN 堆栈(angular、node.js、mongodb、express)中创建一个应用程序,其中用户填写包含 8 个选项的首选项表单,我希望能够查询数据库并找到按最接近的相关首选项排序的用户到最不密切的相关(最少 1 场比赛)。
我查找了 Elastic Search,但我认为这只是一个基于索引的搜索,实际上并不会完全返回用户列表。我有哪些选择?我应该切换到不同的数据库吗?我为猫鼬查找的基于匹配的查询不是动态的......
目前,我的 Preference Schema 设置为具有 8 个不同字段的对象,布尔值表示 true/false。我已经尝试将其作为一个数组来执行,如果选中了首选项,则附加到首选项架构数组中。到目前为止,我无法提出任何可靠的解决方案。
My Schema:
const PreferenceSchema = new mongoose.Schema({
gender: {type: String, required: [true, 'Please select a gender preference.']},
weight_loss: {type: Boolean, default: false},
cardio: {type: Boolean, default: false},
endurance: {type: Boolean, default: false},
flexibility: {type: Boolean, default: false},
strength: {type: Boolean, default: false},
muscle: {type: Boolean, default: false},
genFit: {type: Boolean, default: false}
})
这在用户模式中:
UserSchema = //some code here{
preference: {
type: PreferenceSchema,
default: null
}
// the rest of the schema
}
实际上,我将这个项目搁置了 2 个月,因为我和我在编码训练营的同伴们无法找到解决方案。我最终只是满足于找到所有符合性别偏好的东西。请让我知道我应该研究的方向。
解决方案
您可以使用聚合函数,如下所示:
PreferenceSchema.aggregation([{
$search: ...
}, {
$addFields: {
gender_value: {$cond: [{$eq: ['$genger', gender]}, 1, 0]}
weight_loss_value: {$cond: [{$eq: ['$weight_loss', weightLoss]}, 1, 0]}
...
}
}, {
$project: {
match: {$sum: ['$gender_value', '$weight_loss_value', ...]}
}
}, {
$sort: {
match: 1
}
}
推荐阅读
- javascript - Reactjs 在地图函数中按摩来自两个不同道具字段的数据
- postgresql - 使用 scalikejdbc 插入默认值
- equality - 寻找包含列表可判定相等性的 Agda 模块
- perl - 如何在单个 perl regx 中同时执行负前瞻和负后瞻?
- amazon-web-services - terraform 给出错误模块参数的值无效
- docker - MySQL与本机数据库的连接错误
- c# - 在 .Where 子句中使用的链接谓词
- prometheus - 如何计算“锯”:来自源计数器的每日计数器
- azure - Azure 中国:不支持更改跟踪
- r - 在 R 中使用 predict_rolling 进行 n 步提前预测