【问题标题】:Check existing primary key in dynamodb检查 dynamodb 中的现有主键
【发布时间】:2015-11-16 09:49:47
【问题描述】:

我有一个包含字符串列表的数组 示例:["one","two","three","four"]

我还有一个下面给出的示例 dynamodb 结构

id(primary key)  |   status
one              |  completed
three            |  completed
five             |  completed
six              |  Inprogress

我需要用dynamodb主键检查字符串值是否已经存在于dynamodb中(在nodejs中做这个逻辑)

如果字符串值已经存在于 dynamodb 中,则不要将其添加到新数组中,如果它不存在于 dynamodb 中,则需要将字符串添加到新数组中。

在上面的示例数据中,预期结果是:["two","four"]

请告诉我如何检查 dynamodb 中的现有数据。

提前致谢

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    我不确定我是否完全理解您的问题,但我认为您正在寻找 dynamodb putItem 请求中的 Exists 参数或条件运算符。

    套用the documentation,可以在执行放置操作时断言记录不存在:

    "如果 Exists 为 false,则 DynamoDB 假定属性值不存在 表中不存在。如果实际上该值不存在,则 假设成立,操作成功。如果找到值, 尽管假设它不存在,但操作失败 带有 ConditionalCheckFailedException。”

    同样,应该可以在操作上编写更复杂的断言。

    【讨论】:

    • Yes @david here 我只需要检查数据是否已经存在于 dynamodb 中,我不需要使用 putItem 插入数据。
    • 你不能用 dynamodb getItem() 请求来做这个吗?
    • 如果我们使用 dynamodb.getItem() 对我们需要从数据库中获取所有数据的每个请求执行此操作,然后比较存在。这将产生性能问题。所以我寻找任何其他选项在 dynamodb 中检查存在数据。
    【解决方案2】:

    您可以使用ConditionExpressions 完成此操作。

    var params = {};
    params.TableName = "MyTable";
    params.Item = { id : { S : 'one' }, status : { S : 'completed' } },
    params.ConditionExpression = '#i <> :val';
    params.ExpressionAttributeNames = {'#i' : 'id'};
    params.ExpressionAttributeValues = {':val' : "one"};
    
    DynamoDB.putItem(params, function (error, data) { ... });
    

    仅当 ID 为“one”的项目不存在时才会写入表。

    由于您使用的是 nodejs,我建议您考虑使用 vogels 库。同样的ConditionExpression可以写成:

    Event.create({id : "one", status : 'completed' }, {overwrite : false}, function (error, acc) { ... });
    

    【讨论】:

    • 我有一个数组中的字符串列表。我需要检查这个字符串值是否存在于dynamodb中。并在newarray中添加不存在值。我不需要插入不存在记录在 dynamodb 中。但是带有 ConditionExpressions 的 putItem 插入(非现有值)是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多