当前位置: 首页 > 知识库问答 >
问题:

(DynamoDB集合)集合查询是否需要sortKey?

唐景山
2023-03-14

我正在制作一些lambda来从dynamoDB表中获取数据。

DynamoDB表具有

  • 复合主键
    • 'setId'作为分区键(范围键)(我用这个词'set'作为名词,就像'group'一样)
    • 'id'作为排序键(散列键)

    如果我理解正确,
    我可以使用setId来查询,因为DynamoDb通过分区键进行集合。
    所以我尝试了这个参数

    const params = {
            TableName: MY_TABLE_NAME,
            KeyConditionExpression: `#setId = :setId AND #type = :type `,
            ExpressionAttributeNames: { "#setId": "setId", "#type": "type" },
            ExpressionAttributeValues: {
                ":setId": { S: "set_1" },
                ":type": { S: "type A" },
            },
        }
    

    但它返回错误

    ValidationException: Query condition missed key schema element: id
    

    Q.

    • 获取集合是否需要排序键?

    提前谢谢!

    仅供参考)我也尝试了GSI和下面的工作,因为我的预期。.

    const params = {
            TableName: MY_TABLE_NAME,
            IndexName: "blahblah",
            KeyConditionExpression: `#type = :type`,
            FilterExpression: `#setId = :setId`,
            ExpressionAttributeNames: { "#setId": "setId", "#type": "type" },
            ExpressionAttributeValues: {
                ":setId": { S: "set_1" },
                ":type": { S: "type A" },
            },
        }
    

共有1个答案

田翰林
2023-03-14

‎您向我们显示了请求参数,但没有显示您正在执行的请求。DynamoDB有两个与您的情况相关的不同读取请求-GetItemQuery

  • 第一个,GetItem,只能获取单个项目,并且单个项目由其完整主键指定(在您的情况下,setId和id)。不能使用GetItem,只能指定主键的一部分。如果你这样做了,你会看到一个类似于你看到的错误。
  • 第二种类型的请求,Query,可能是您想要使用的请求。它可以获取具有相同分区键(setId)的所有项,并按排序键(id)进行排序,并且您不需要在查询中指定特定的排序键。请阅读留档如何使用Query,并注意结果是分页的(理论上,一个查询可能返回数百万个项目,但不能在一个页面中完成)。

请求中的另一个问题(可能就是您看到的问题?)是您试图在KeyConditionExpression中使用#type=:type。您不能这样做——正如它的名字所说,键条件只是主键的条件——而类型不是(除非您查询的是GSI)。您应该将此条件放入过滤器表达式,而不是KeyConditionExpression

 类似资料:
  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 基本上,我有一组顶点ID,我想遍历并从某些外边找到一组顶点。我想把外边后面的顶点与它来自的准确性联系起来。例如:,所以v1有2个输出边(e1和e2)到v2和v4,而v3有2个输出边(e3和e4)到v5和v6。我想要的是得到如下所示的遍历结果 有人能帮我使用Gremlin遍历吗?最接近的例子是

  • 我有一个名为“Prices”的MongoDB集合,我试图查询“startDate”和“endDate”之间的价格。 该集合每10秒存储一次价格,但是当查询此集合以绘制图形时,每1-2分钟的价格才是真正重要的。 我尝试用两种不同的方式编写此查询: 方法1:使用{$gte:startDate,$lte:endDate} 此方法引发以下错误: 如果删除排序('-timestamp')行,并再次运行此查询

  • 我想我读到您可以使用新的Firebase Firestore查询子集合,但我没有看到任何示例。例如,我以以下方式设置了Firestore: 舞蹈[收藏] DanceName 歌曲[收藏] 松南 我如何才能查询“查找所有的舞蹈在songName=='x'”

  • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行

  • 问题内容: 我是Node.js和Heroku的新手,我构建了一个使用node.js并从mongodb实例检索一些数据的小应用程序。我设置了整个程序,但是我的问题是我认为mongodb的语法很简单。 我需要在启动应用程序时知道我的收藏夹中是否包含任何东西,如果没有,则不进行初始化。我尝试调用collection.count(),但返回未定义。 我尝试这样做 任何帮助表示赞赏。 问题答案: 任何访问数