Как вернуть результаты, упорядоченные по наибольшему количеству совпадений, на наименьшее в Mongoose / MongoDB? - PullRequest
0 голосов
/ 23 сентября 2019

Я создаю приложение в стеке MEAN (angular, node.js, mongodb, express), где пользователи заполняют форму предпочтений, которая включает 8 вариантов, я хочу иметь возможность запрашивать базу данных и находить пользователей, упорядоченных по ближайшимсвязанные параметры предпочтений для наименее близких связанных (мин. 1 совпадение).

Я посмотрел Elastic Search, но я думаю, что это только поиск по индексу, и я не смогу полностью вернуть список пользователей.Каковы некоторые из моих вариантов?Должен ли я перейти на другую базу данных?Запросы на основе совпадений, которые я искал для mongoose, не такие динамические ...

В настоящее время моя схема предпочтений настроена как объект с 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 месяца, потому что я и мои коллеги из учебного лагеря по программированию не могли найти решение для него.Я просто согласился найти все, что соответствует гендерным предпочтениям.Пожалуйста, дайте мне знать, в каком направлении я должен смотреть.

1 Ответ

0 голосов
/ 24 сентября 2019

Вы можете использовать функцию агрегирования, например, такую:

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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...