有条件地从列表属性中删除项目

Remove items from list attribute conditionally

我有一个带有列表属性的项目,列表的每个元素都是一张地图。

"listAttr": [
    {"field1":"value1", "field2":"value2", ...}
    , {"field1":"value3", "field2":"value4", ...}
    ....
]

我想执行如下所示的 REMOVE 语句:

REMOVE listAttr[x]

条件是

listAttr[x].field1 = :val

我想删除列表中符合我条件的所有元素

我不想先查询项目来计算 id,因为它会在插入和删除之间造成竞争(在我执行 REMOVE 时 id 可能会不同步)

SQL 等效项为:

DELETE from listAttr where field1=?

我该怎么做?

我的理解是这在 DynamoDB 中是不可能的。您可以使用带有乐观锁定的 PUT 操作来避免丢失更新。

如果频繁写入项目会使此操作不可行,那么您可以研究“垂直分区”,将单个大项目拆分为多个项目,这可以降低竞争条件的风险,以防应用程序一次仅更改项目的一部分,并可能降低读取或写入的成本,以防单个项目大几 kb,并且您可以进行更有针对性的查询。