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

Я пытаюсь передать нормализованные значения результатов в MongoDB и выполнить запрос, чтобы найти самые близкие подходящие тесты в коллекции.

В настоящее время я пытаюсь сделать это, нормализуя все тестовые значения, получив сумму тестовых значений в документе, затем разделив тестовое значение на общее количество тестовых значений и умножив его на 100.

Следующим шагом, который я делаю, будет вычисление разницы между нормализованными значениями, которые я предоставляю MongoDB, и нормализованными значениями в массиве результатов в MongoDB, затем суммируем различия по документам и сортируем по полю totalDiffs. надеюсь получить самые близкие совпадения.

Я дошел до возможности суммировать значения, нормализовать значения в отдельных результатах, и в настоящее время я застрял в расчете разницы от предоставленных значений результатов и значений в документе.

db.getCollection("tests").aggregate([
    {$addFields: {"totalResultValues": {$sum: "$results.value"}}},
    {$addFields: {
        "results": {
            $map:{
                input: "$results",
                as: "result",
                in: {
                    "result_id": "$$result.result_id",
                    "value": "$$result.value",
                    "normalizedValue": {$multiply: [
                        {$cond: [{$eq: ["$totalResultValues", 0]}, 0, {$divide: ["$$result.value", "$totalResultValues"]}]}, 100]}
                }},
            }}},
    {$addFields: {
        "results": {
            $map:{
                input: "$results",
                as: "result",
                in: {
                    "result_id": "$$result.result_id",
                    "value": "$$result.value",
                    "normalizedValue": {$multiply: [
                        {$cond: [{$eq: ["$totalResultValues", 0]}, 0, {$divide: ["$$result.value", "$totalResultValues"]}]}, 100]}
                }},
            }}},
], {allowDiskUse: true})

Сейчас документ с результатами теста выглядит следующим образом:

{
  "_id":"5ca7b3f3f8f134e1e5ad65b8",
  "created":"2019-04-05T20:00:51.615Z",
  "updated":"2019-04-05T20:00:51.615Z",
  "name":"Test Result Name",
  "results":[
    {
      "result_id":"5ca797f8c906436c0fc7e3d6",
      "value":0.002
    },
    {
      "result_id":"5ca797f8c906436c0fc7e3d0",
      "value":0.102
    },
    {
      "result_id":"5ca797f8c906436c0fc7e3bc",
      "value":0
    },
   ...
  ]
}

В настоящее время я надеюсь, что смогу предоставить MongoDB массив объектов с полями ниже. Этот массив может иметь более 30 различных результатов для сравнения с массивом результатов теста в Mongo.

[
  {
    "result_id":"5ca797f8c906436c0fc7e3d6",
    "normalizedValue":0.002
  },
  {
    "result_id":"5ca797f8c906436c0fc7e3d0",
    "normalizedValue":0.102
  },
  {
    "result_id":"5ca797f8c906436c0fc7e3bc",
    "normalizedValue":0.482
  },
  ...
]

Затем, мы надеемся, что документ вернется в этом формате, отсортированном по ближайшим подходящим результатам теста:

{
  "_id":"5ca7b3f3f8f134e1e5ad65b8",
  "created":"2019-04-05T20:00:51.615Z",
  "updated":"2019-04-05T20:00:51.615Z",
  "name":"Close Test Result Name",
  "results":[
    {
      "result_id":"5ca797f8c906436c0fc7e3d6",
      "value":0.002,
      "normalizedValue": 2.232
    },
    {
      "result_id":"5ca797f8c906436c0fc7e3d0",
      "value":0.102,
      "normalizedValue": 10.563
    },
    {
      "result_id":"5ca797f8c906436c0fc7e3bc",
      "value":0,
      "normalizedValue": 0
    },
   ...
  ]
}

Если кто-нибудь сможет указать мне направление, чтобы решить эту проблему, или дайте мне знать, если это возможно, я буду очень признателен. Я использую Mongo-Go-драйвер, но я должен быть в состоянии перевести его из оболочки. Спасибо.

...