首页 > 解决方案 > 如何在 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 个月,因为我和我在编码训练营的同伴们无法找到解决方案。我最终只是满足于找到所有符合性别偏好的东西。请让我知道我应该研究的方向。

标签: javascriptnode.jsangularmongodbangular8

解决方案


您可以使用聚合函数,如下所示:

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
  }
}

推荐阅读