Amazon dynamodb 使用动态值对DynamoDB中的项目进行排序?

Amazon dynamodb 使用动态值对DynamoDB中的项目进行排序?,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-data-modeling,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Data Modeling,我在一张桌子里有成千上万的东西。每个项目都有一个数值属性分数。我想做的是: 给定一些targetScore,选择所有项目,其中targetScore-n您实际上不需要步骤1来获得步骤2。我假设score是设置中的排序键 在第2步中,您需要按abs(targetScore-score)对项目进行排序,并取j最低的项目 虽然DynamoDB没有任何直接的方法来实现这一点,但是绝对值的定义使得它非常容易实现。首先,请注意“abs(targetScore-score)”的定义如下:它是: targetS

我在一张桌子里有成千上万的东西。每个项目都有一个数值属性
分数
。我想做的是:


  • 给定一些
    targetScore
    ,选择所有项目,其中
    targetScore-n您实际上不需要步骤1来获得步骤2。我假设
    score
    是设置中的排序键

    在第2步中,您需要按
    abs(targetScore-score)
    对项目进行排序,并取
    j
    最低的项目

    虽然DynamoDB没有任何直接的方法来实现这一点,但是绝对值的定义使得它非常容易实现。首先,请注意“abs(targetScore-score)”的定义如下:它是:

  • targetScore-如果
    score=targetScore,则得分
  • 因此,abs最小的项目是得分高于
    targetScore但尽可能低的项目,或者得分低于
    targetScore但尽可能高的项目

    因此,您可以执行两个独立的DynamoDB查询:

  • 查询第一个
    j
    项目
    score>=targetScore
    ,按递增
    分数排序
  • 查询具有
    分数
    的第一个
    j
    项目,按递减
    分数排序
  • DynanoDB可以高效且廉价地为您执行这两项查询—它包括一个带有
    KeyConditions
    参数和
    Limit
    查询
    ,以及
    ScanIndexForward
    进行递减排序。但是没有昂贵且低效的
    过滤器表达式


    一旦您拥有了每种类型1和类型2的
    j
    最小项,剩下的就是从我们得到的
    2*j
    项中选择总体
    j
    最小项。

    没有主键,我如何进行
    查询
    ?另外,
    score
    在我的例子中不是一个排序键,只是一个任意属性。如果score不是一个排序键,你可以用filtereexpression执行我说的操作,但要为读取整个数据库付费。。。你需要它作为廉价请求的排序键…明白了。谢谢关于
    查询
    ,尽管如此。我不需要指定一个特定的分区键以便
    查询
    ?我想做的是获取所有可能的项目(跨多个分区),其中分数在一个范围内。好吧,你有
    Scan
    ,但这将更加昂贵-它基本上读取整个数据库!我不知道这是否真的是你想要的…正是我的问题。我目前正在做一个
    扫描
    ,因为我想不出一个切实可行的方法来实现我想要的。我是否应该有一个二级索引,其中所有内容都具有相同的分区键,以便我可以执行您建议的两个查询?