gpt4 book ai didi

Mongodb - 按计算字段排序

转载 作者:IT老高 更新时间:2023-10-28 12:32:07 27 4
gpt4 key购买 nike

我正在努力寻找解决 mongo db 问题的方法:

我需要对具有高写入/读取比率的集合运行查询。查询包括按从其他字段派生的字段对文档进行排序属于同一文档的字段。此外,其中一个字段是数组的大小,这使它变得更加困难。

一个简单的例子:

D1 - { _id: 1, field: 1, array_field: [a,b,c,d] } -> score = 1 + 4 = 5
D2 - { _id: 2, field: 2, array_field: [a,b] } -> score = 2 + 2 = 4

预期结果:

D1 - { _id: 2, score: 4 }
D2 - { _id: 1, score: 5 }

(结果集中不需要分数)

到目前为止我尝试过的解决方案:

  1. 将分数添加为文档的一个字段,该字段会持续更新,其他字段也会更新。问题:

    • 一旦计算出分数,就无法对查询进行参数化(调整)
    • 这很昂贵,因为分数上的索引必须非常频繁地更新
  2. 创建一个聚合管道,使事情变得容易开发并解决参数化问题。但是,性能下降非常高,因为 mongo 不能依赖在计算字段上使用索引,从而导致内存问题(100MB 查询错误)。一种可能的解决方案是启用 allowDiskUse 标志。但是,查询会变得太慢。

更新:我想指出查询将每秒运行大约 10 次。因此,预先计算分数并将其存储在不同的文档中可能不是一个可行的解决方案。

实际使用:因为问题很困难。让我给你更多的背景信息。我有一个帖子文档(如 facebook 帖子),我目前正在按创建日期和上次更新排序。我希望能够按我所说的分数定义的“热度”对帖子进行排序。我认为计算分数的一种有趣方法可能如下:

score = a * likes - b * dislikes + c * num_comments + d * ( now - creation_date)

其中 abcd 是我可以更改以调整算法的参数。 likesdislikes 是引用用户的 ObjectID 数组,而 num_comments 只是评论的数量。运行查询以向 REST 端点提供响应。没有进一步的操作:请求 -> 查询 -> 响应。

您对派生/聚合字段有任何经验吗?谢谢!

最佳答案

这看起来很复杂。

这个查询可以完成这项工作,但我想听听你关于性能的看法。

db.perlz.aggregate([
// {$match:{whatever is needed here}}
{
$project : {
_id : 1,
score : {
$sum : [{
"$size" : "$array_field"
}, "$field"]
}
}
}, {
$sort : {
score : 1
}
}

])

由于这是在繁忙的服务器上完成的,我会考虑设置副本集,并尝试通过在从属服务器上发出一些查询来平衡负载。

编辑

根据您的更新,我想知道这些步骤是否适用于这个问题:

  1. 更新文档结构以具有两种类型的喜欢:processednewProcessed like 是由工作人员添加到文档分数中的like(影响 likes、dislikes、numComments 字段)和设置分数 - 然后我们需要计算 delta/差异值。

  2. 尝试根据前一点确定最低输入集(预先计算的分数)

  3. 将输出限制为已知数量的文档(实现分页)

根据动态字段值 - 无需大量计算即可获得分值。可以考虑的是将计算中使用的字段和_id投影,然后使用$lookup作为最后阶段和macz父文档进行评分和排序结果。

欢迎评论!

关于Mongodb - 按计算字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38075096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com