0

我正在尝试对 dynamoose 模型执行更新。这是关于调用的文档model.update

Model.update(key[, updateObj[, settings]],[ callback])

key可以是表示hashKey的字符串或包含hashKeyrangeKey的对象。

我的架构同时具有哈希键(分区键)和范围键(排序键),如下所示:

// create model
let model = dynamoose.model(
  "SampleStatus",
  {
    id: {
      type: String,
      hashKey: true,
    },
    date: {
      type: Date,
      rangeKey: true,
    },
    status: String,
  });

我创建了一个像这样的对象(带有固定的演示时间戳)

let timestamp = 1606781220842; // Date.Now()
model.create({
  id: "1",
  date: new Date(timestamp),
  status: "pending",
});

我希望能够status通过引用id这样的属性来更新属性:

model.update({id: "1"}, {status: "completed"})
// err: The provided key element does not match the schema

model.update("1", {status: "completed"})
// err: Argument of type 'string' is not assignable to parameter of type 'ObjectType'

但两者都导致显示的错误:

如果我知道时间戳,我可以传入完整的复合键,因此以下起作用:

let timestamp = 1606781220842; // Date.Now()
model.update({ id: "1", date: timestamp }, { status: "completed" });

但是,这需要我坚持时间戳并与 id 保持一致。

在我的例子中,ID 字段本身应该是唯一的,所以我不需要两者都创建一个键,但想将日期添加为范围键以便它是可排序的。我应该只更新我的架构,以便只有一个哈希键吗?我在想那些说“`key可以是代表hashkey的字符串”的文档会让我只传递ID,但这会在编译时引发错误(在打字稿中)。

有什么建议么?

4

3 回答 3

1

这里的解决方案是从date属性中删除 rangeKey。

这是因为在 DynamoDB 中,每个文档/项目都必须有一个唯一的“键”。这可以是 hashKey 或 hashKey + rangeKey。

由于您提到您的id属性是唯一的,您可能只想使用 hashKey 作为键,这应该可以解决问题。

在您的示例中,可能有许多具有该 ID 的文档,因此 DynamoDB 不知道要更新哪个。

不要忘记这会导致您的表发生更改,因此您可能必须删除并重新创建表。但这应该可以解决您遇到的问题。

于 2020-12-01T04:29:49.143 回答
0
// create model
let model = dynamoose.model(
  "SampleStatus",
  {
    id: {
      type: String,
      hashKey: true,
      "index": {
         "name": "index_name",
         "rangeKey": "date",
      } 
    },
    date: {
      type: Date
    },
    status: String,
  });

您必须告诉架构 hashKey 和 range 是一个分区键。

参考:https ://dynamoosejs.com/guide/Schema#index-boolean--object--array

于 2021-11-22T14:53:29.797 回答
0

从逻辑上讲,没有什么比在同一个分区中插入超过 1 个条目(在您的情况下是唯一 id)中阻止您。如果日期不同,您可以插入多个具有相同 ID 的项目。

因此,如果您只想通过其分区键(实际上是唯一 ID)获取项目,则需要使用查询来检索项目(与 GET 相对),但返回签名将是项目的集合。如您所知,分区中只有一个项目,您可以取第一个项目,并指定限制为 1 以保存 RCU。

于 2020-12-03T22:44:29.920 回答