Расширенное сопоставление / оценка с MongoDB по набору ответов / вопросов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть пользовательские данные, которые выглядят так:

{
    name: 'Some Name',
    uid: 'rew54bth324'
    // Can be 1000s
    answers: {
       do_you_like_cars: 'Prefer bikes',
       hotels_or_hostels: 'Tents!',
       vegan: 'Pesca',
    },
    // Can be 100,000s.
    usersSeenThisUser: [
        'wgwewg343',
        'vyuzx3tg'
    ],
    lat: 32.0,
    lng: 43.5
}

Другой пользователь также ответил на ряд вопросов, некоторые из которых могут быть одинаковыми. Мой вопрос: как мне получить список результатов, основанный на том, сколько ответов одинаковы / похожи (по крайней мере 1), игнорируя пользователей, увидевших этого пользователя.

В ElasticSearch это очень просто с ', и он также дает вам максимальный балл + балл за каждый результат.

Какой будет запрос в пн go

1 Ответ

1 голос
/ 31 марта 2020

Вы можете попробовать запрос ниже:

db.collection.aggregate([
  /** Optional - Remove unnecessary fields to reduce document size  */
  { $project: { usersSeenThisUser: 0 } },
  /** Convert 'answers' object to array [{k:...,v:...},{k:...,v:...}] */
  { $addFields: { answers: { $objectToArray: "$answers" } } },
  /** Unwind 'answers' array inorder to group similar answered question & it's value */
  { $unwind: "$answers" },
  /** Group on k & v & push user who has similar answers */
  {
    $group: {
      _id: { k: "$answers.k", v: "$answers.v" },
      users: { $push: "$name" }
    }
  },
  /** match docs(answers) which has two or more users */
  { $match: { $expr: { $gte: [{ $size: "$users" }, 2] } } },
  /** Group on 'users' array where two user's array is same & push all answers to 'answers' array */
  {
    $group: {
      _id: "$users",
      answers: {
        $push: "$_id"
      }
    }
  },
  /** Transform fields to the way required, answers array of objects to a single object {k:v,k:v} */
  {
    $project: { _id: 0, users: "$_id", answers: { $arrayToObject: "$answers" } }
  }
]);

Тест: MongoDB-Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...