如何使用MongoDB聚合找到与提供的值最接近的匹配

时间:2019-04-08 18:59:15

标签: mongodb mongodb-query aggregation-framework

我正在尝试向MongoDB提供标准化的结果值,并查询以在集合中找到最匹配的测试。

目前,我正在尝试通过获取文档中测试值的总和来标准化所有测试值,然后将测试值除以总测试值,然后将其乘以100。

下一步,我将计算要提供给MongoDB的归一化值与MongoDB结果数组中的归一化值之间的差,然后对每个文档的差异求和并按totalDiffs字段进行排序希望能找到最接近的匹配项。

我已经能够对这些值进行求和,对各个结果中的值进行归一化,并且我目前仍在计算与提供的结果值和文档中的结果值之差。 / p>

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-driver,但是我应该能够从shell进行翻译。谢谢。

0 个答案:

没有答案