Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中的加权平均排名_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB中的加权平均排名

MongoDB中的加权平均排名,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,假设MongoDB中有100000000个实体,每个实体有3个数字属性,a、B和C 例如: entity1 : { A: 35, B: 60, C: 5 } entity2 : { A: 15, B: 10, C: 55 } entity2 : { A: 10, B: 10, C: 10 } ... 现在我需要查询数据库。查询的输入将是3个数字:(a、b、c)。结果将是按加权平均值定义的降序排列的实体列表,或a*a+B*B+C*C 因此q(1100,1)将返回(entity1,entity2,

假设MongoDB中有100000000个实体,每个实体有3个数字属性,a、B和C

例如:

entity1 : { A: 35, B: 60, C: 5 }
entity2 : { A: 15, B: 10, C: 55 }
entity2 : { A: 10, B: 10, C: 10 }
...
现在我需要查询数据库。查询的输入将是3个数字:
(a、b、c)
。结果将是按加权平均值定义的降序排列的实体列表,或
a*a+B*B+C*C

因此
q(1100,1)
将返回
(entity1,entity2,entity3)
q(1,1100)
将返回
(entity2,entity1,entity3)

使用MongoDB可以实现类似的功能,而不需要计算每个查询中每个实体的加权平均数吗?我不一定要使用MongoDB,但我正在学习平均堆栈。如果我必须用别的东西,那也没关系


注意:我选择100000000个实体作为一个极端的例子。我的实际用例只有~5000个实体,因此迭代所有内容可能没问题,我只是对一个更聪明的解决方案感兴趣。

当然,如果您提供输入,并且不能使用预先计算的字段,您必须计算它,但这里唯一的区别是返回所有项目并在客户机中对它们进行排序,或者让服务器完成工作:

var a = 1,
    b = 1,
    c = 100;

db.collection.aggregate(
    [
        { "$project": {
            "A": 1,
            "B": 1,
            "C": 1,
            "weight": {
                "$add": [
                    { "$multiply": [ "$A", a ] },
                    { "$multiply": [ "$B", b ] },
                    { "$multiply": [ "$C", c ] }
                ]
            }
        }},
        { "$sort": { "weight": -1 } }
    ],
    { "allowDiskUse": true }
)
因此,这里的关键是该方法允许对文档进行操作,这是生成应用该方法的值所必需的

在此之前,计算出的值将在管道阶段提供给输入管道的每个外部变量的每个字段值,最后的数学运算将对结果中的每个参数执行一次运算,以生成“权重”作为要排序的字段

您不能直接向MongoDB中的任何“排序”方法提供算法,因为它们需要对文档中的字段进行操作。聚合框架提供了“投影”该值的方法,因此稍后的管道阶段可以执行所需的排序


这里的另一种情况是,由于您通常建议的文档大小,最好提供一种选项,强制聚合过程将处理过的文档临时存储在磁盘上,而不是内存中,因为在聚合过程中可以使用一种不带此选项的方法。

谢谢您的回答。它清楚地展示了如何使用聚合为我在MongoDB中的问题应用暴力解决方案。但是,我想看看是否有更聪明的方法来存储值、对实体排序,甚至创建额外的中间实体,以便在计算每个实体的加权平均值之前减少解决方案空间。@clocksmith您的问题直接说明传递参数,因此,不可能使用预先计算的参数值,我已经声明了这一点。如果您确实有固定的可能性组合,那么只需在存储时计算每个排序字段。根本没有“聪明”的作弊方法。您可以存储这些值,也可以动态计算它们。