我有一个用例,一个人可以没有。推车。这是可能的,因为1)用户可以使用购物车完成订单,并且在该购物车被认为是关闭之后2)用户可以将购物车放置2个月并且它被认为是过期的。如果用户在2个月大的购物车上添加新商品,则旧购物车标记为已过期并生成新购物车。
我尝试设计下表:
Table Name: Cart
Primary Hash Key: cartId (String)
Primary Range Key: updated (String)
我正在使用更新作为范围列,以便当我查询它时,我可以在用户更新这些时将所有购物车分类,我可以选择第一个(或最后一个)而不用自己排序以获得最新购物车。但是这会弄乱我的用例。
如果用户添加了另一个项目,我会更新购物车中的项目并更新更新的列。然而,这为我创建了另一个购物车(具有相同的购物车ID但具有新的更新列)。重新阅读文档之后,我明白主键是cartId的复合并且已更新,所以我应该将其删除。但是我相信我的用例足够真实,在我的情况下,我必须在应用程序中进行排序。另一种方法是使用自动增量作为范围,但这是放置列的非直观方式。如果有工作请告诉我。我正在使用DynamoDBMapper并发布我的类(只有几个字段)。
import java.util.Set;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
@DynamoDBTable(tableName="Cart")
public class Cart {
private String cartId;
private String email;
private Set<String> cartItemsJson;
private String status;
private String created;
private String updated;
@DynamoDBHashKey(attributeName="cartId")
public String getCartId() {
return cartId;
}
public void setCartId(String cartId) {
this.cartId = cartId;
}
@DynamoDBAttribute(attributeName="email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@DynamoDBAttribute(attributeName="cartItems")
public Set<String> getCartItemsJson() {
return cartItemsJson;
}
public void setCartItemsJson(Set<String> cartItemsJson) {
this.cartItemsJson = cartItemsJson;
}
@DynamoDBAttribute(attributeName="status")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@DynamoDBAttribute(attributeName="created")
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
@DynamoDBRangeKey(attributeName="updated")
@DynamoDBVersionAttribute(attributeName="updated")
public String getUpdated() {
return updated;
}
public void setUpdated(String updated) {
this.updated = updated;
}
}
这是持久层代码。我尝试了各种Save行为组合,但结果仍然相同。
protected static DynamoDBMapper mapper = new DynamoDBMapper(dynamoDbClient);
mapper.save(cart,new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE));
答案 0 :(得分:0)
在DynamoDB中,您无法更新哈希或范围键。更新它们意味着删除并创建一个新条目。
我知道您可以创建辅助索引。也许这会有所帮助。 此外,我认为您可以克服更新的范围键。您可以按如下方式创建表:
当您需要特定用户的最后一个cardId时,您可以获得前6行的hashkey =您的用户并进行反向排序,以便您先获得最后一行。 当您需要向卡片添加项目时,您不需要更新哈希/范围键。
希望它有所帮助。