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