簡體   English   中英

在 AWS dynamoDB 中更新 JSON 數組

[英]updating a JSON array in AWS dynamoDB

我的文檔是這樣的:

{
  "data": {
      "eventId": "20161029125458-df-d",
      "name": "first",
      "purpose": "test",
      "location": "yokohama",
      "dateArray": [],
      "attendees": [
        {
          "attendeeId": "2016102973634-df",
          "attendeeName": "lakshman",
          "personalizedDateSelection": {}
        },
        {
          "attendeeId": "2016102973634-tyyu",
          "attendeeName": "diwaakar",
          "personalizedDateSelection": {}
        }
      ]
    }
}

比如說,我需要使用attendeeId: 2016102973634-df更新參與者JSON 數組。 我嘗試了很多使用update 和 condition expression 的方法,但沒有成功。

這是我的嘗試:

const params = {
  TableName: "event",
  Key: {
    "eventId": eventId 
  },
  UpdateExpression: "SET attendees[???] = ",
  ConditionExpression: attendees.attendeeId = "2016102973634-df", 
  ExpressionAttributeValues: {
    ":attendee" : attendeeList
  },
  ReturnValues: "ALL_NEW"
};


dynamo.update(params, (err, data) => {
  if (err) {
    return reject(err);
  }
  console.log(data.Attributes);
});

找不到用於更新數組中的 Json 的任何資源。

在@notionquest 的評論之后: - 沒有使用任何 JsonMarshaller。 最初我將空數組添加到與會者字段,如下所示:

{
  "eventId": "20161029125458-df-d",
  "name": "first",
  "purpose": "test",
  "location": "yokohama",
  "dateArray": [],
  "attendees": []
}

然后當新的與會者到來時,我將其添加到與會者屬性中,如下所示:

const attendee = {
  "attendeeName": "user1",
  "personalizedDateSelection": {"today": "free"}
}
const attendeeList = [attendee];
const eventId = "20161029125458-df-d";


const params = {
  TableName: "event",
  Key: {
    "eventId": eventId
  },
  UpdateExpression: "SET attendees = list_append(attendees, :attendee)",
  ExpressionAttributeValues: {
    ":attendee" : attendeeList
  },
  ReturnValues: "ALL_NEW"
};


dynamo.update(params, (err, data) => {
  if (err) {
    return reject(err);
  }
  console.log("in update dynamo");
  console.log(data.Attributes);
});

正如您在上面的代碼片段中看到的,最初我添加了空的[] 數組使用上面的代碼添加了一個新的參與者 現在,如何更新數組中的特定 JSON。 如果你說那不可能,我還能嘗試什么?

我應該試試這個:

  1. 獲取完整的 JSON。
  2. 操縱 JSOn 並在我的 nodeJS 中更改我想要的東西。
  3. 然后將新的 JSON 更新為 dynamoDB。
  4. 但這會消耗兩次對 dynamoDB 的調用,這似乎效率低下。

想知道有沒有圓路?

您可以存儲列表的索引。 在更新列表時,我們可以使用它們。 例如,

{


"data": {
      "eventId": "20161029125458-df-d",
      "name": "first",
      "purpose": "test",
      "location": "yokohama",
      "dateArray": [],
      "attendees": [
        {  
          "index":0,  
          "attendeeId": "2016102973634-df",
          "attendeeName": "lakshman",
          "personalizedDateSelection": {}
        },
        {
           "index":1,
          "attendeeId": "2016102973634-tyyu",
          "attendeeName": "diwaakar",
          "personalizedDateSelection": {}
        }
      ]
    }
}
const params = {
  TableName: "event",
  Key: {
    "eventId": eventId 
  },
  UpdateExpression: "SET attendees[attendee.index].attendeeName = :value",
  ExpressionAttributeValues: {
    ":value" : {"S":"karthik"}
  },
  ReturnValues: "ALL_NEW"
};


dynamo.update(params, (err, data) => {
  if (err) {
    return reject(err);
  }
  console.log(data.Attributes);
});

更新查詢的示例:

數據結構(保存在DynamoDB中)

{
  tenant_id: 'tenant_1',
  users: {
    user1: {
      _id: 'user1',
      email_address: 'test_email_1@gmail.com'
    },
    user2: {
      _id: 'user2',
      email_address: 'test_email_2@gmail.com'
    }
  }
}

更新數據(在參數中使用)

var user = {
 email_address: 'updated@gmail.com'
}

參數

var params = {
    TableName: 'tenant-Master',
    Key: {
       "tenant_id": 'tenant_1'
    },
    UpdateExpression: "set #users.user1 = :value",
    ExpressionAttributeNames: {
    "#users": "users"
    },
    ExpressionAttributeValues: {
    ":value": user,
    },
 };

說明

通過從地圖數組切換到地圖地圖,我們現在可以使用UpdateExpression: "set #users.user1 = :value"user1的 id 更新用戶地圖上的嵌套對象。

注意:此方法按原樣將替換整個地圖對象在users.user1 如果您想保留預先存在的數據,則需要進行一些更改。

我找不到任何查詢和更新 JSON 數組的答案。 我認為這可能是 AWS 不允許使用這些功能的盈利動機。 如果您需要查詢主鍵以外的特定 ID,則需要創建一個具有成本效益的二級索引。 此二級索引成本是 dyn amoDB 表成本的附加成本。

由於我不想在二級索引上支付額外費用,因此我將 dynamoDB 架構更改為以下內容:

{
  "data": {
      "eventId": "20161029125458-df-d",
      "name": "first",
      "purpose": "test",
      "location": "yokohama",
      "dateArray": [],
      "attendees": {
        "2016102973634-df": {
          "attendeeId": "2016102973634-df",
          "attendeeName": "lakshman",
          "personalizedDateSelection": {}
        },
        "2016102973777-df": {
          "attendeeId": "2016102973777-df",
          "attendeeName": "ffff",
          "personalizedDateSelection": {}
        }
      }
    }
}

將與會者從[]更改為{} 這使我可以靈活地查詢特定的參加者 ID並更改與之關聯的整個 JSON。 盡管這是一個多余的步驟,但我不想在我的愛好項目上花費額外的錢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM