Javascript 按动态添加字段排序

Javascript 按动态添加字段排序,javascript,node.js,mongodb,sorting,aggregation-framework,Javascript,Node.js,Mongodb,Sorting,Aggregation Framework,我的数据库中有2000万个文档,它们的方式如下 { "_id": ObjectId("5bb84e931cb3d25a3b21d14e"), "merchant": "menswearhouse.com", "category": "Fashion > Clothing > Men's Clothing", "feature": [ "-0.899652959529", "-0.02401520125567913",

我的数据库中有2000万个文档,它们的方式如下

 {
    "_id": ObjectId("5bb84e931cb3d25a3b21d14e"),
    "merchant": "menswearhouse.com",
    "category": "Fashion > Clothing > Men's Clothing",
    "feature": [
      "-0.899652959529",
      "-0.02401520125567913",
      "0.08394625037908554",
      "0.06319021433591843",
      "-0.015963224694132805"
    ]
  }
现在我有下面的数组,我需要用它来查找文档

const dummy = [
  "-0.899652959529",
  "-0.02401520125567913",
  "0.08394625037908554",
  "0.06319021433591843",
  "-0.015963224694132805"
];
我需要

  • 找出所有值的差异,即需要用虚拟数组的第一个索引减去
    功能的第一个索引,依此类推所有5个值
  • 取所有值的平方
  • 将所有5个值相加
  • 取平方根
  • 使用该字段对所有值进行排序,只获得5个文档
  • 我正在使用此查询,当我使用
    $limit
    时,该查询将
    $project
    替换字段。但是我需要使用
    $project
    ed字段对
    $sort
    进行排序,并需要获取前5个文档。但是有两千万份文件,它不会返回任何东西,而且会一直持续下去

    db.collection.aggregate([
      { $project: {
        field: {
          $sqrt: {
            $sum: {
              $map: {
                input: { $range: [0, { $size: '$feature' }] },
                as: "d",
                in: {
                  $pow: [
                    {
                      $subtract: [
                        { $toDouble: { $arrayElemAt: [dummy, "$$d"] }},
                        { $toDouble: { $arrayElemAt: ["$feature", "$$d"] }}
                      ]
                    },
                    2
                  ]
                }
              }
            }
          }
        }
      }}
    ])
    
    我可以在运行时创建的字段上使用索引吗


    谢谢

    简短的回答是否。您不能在运行时创建的字段上创建索引。撰写本文时,MongoDB无法实现您想要的。但是你可以并行计算它们。假设您的服务器有适当的资源(CPU和内存),您可以在应用程序中划分作业并并行执行它们。对于简单的数学,假设您有20000000(mil)个文档,并将它们划分为20个任务。对于每个任务,它将处理1000000个文档并返回前5个结果。第一个任务的管道将是

    [
        {
            '$sort': {
                '_id': 1
            }
        }, {
            '$skip': 0
        }, {
            '$limit': 1000000
        }, {
            '$project': {
                'field': {
                    '$sqrt': {
                        <do your thing>
                    }
                }
            }
        }, {
            '$limit': 5
        }
    ]
    
    [
    {
    “$sort”:{
    “_id”:1
    }
    }, {
    “$skip”:0
    }, {
    “$limit”:1000000
    }, {
    “$project”:{
    “字段”:{
    “$sqrt”:{
    }
    }
    }
    }, {
    “$limit”:5
    }
    ]
    

    返回所有线程(任务)后,将结果(仅100个文档)合并到应用程序中,按
    字段对它们进行排序,最后获得前5个文档。请注意,您必须考虑硬件资源才能得到最佳的划分任务数量。

    您可以提供当前的收集索引吗?HI @ JonathanMuller I现在没有创建任何索引。我需要创造吗?事实上,这不会有多大帮助。我要求有更多的背景来准备答案。你的问题很复杂还有几个问题:你能详细说明“全部添加128个值”吗?“取所有值的平方”=>包含在“功能”数组中的值的平方或“功能”和“虚拟”数组之间所有差异的平方?“功能”和“虚拟”数组总是包含5个元素?20个任务包含100000个文档,1个任务包含2000000个文档有什么区别?@Profer,关键是同时运行20个任务。您必须使用支持多线程或异步的编程语言。