2

我正在使用JSON結構來存儲某個人的詳細信息。基本上名稱,電話,registeredTimestamp等,將是其他屬性,主鍵將是電子郵件地址。使用NodeJS將新對象追加到DynamoDB中的JSON數組中

markedLocations,visitedLocations,searchHistory和recommendation是AWS調用它時的列表或Map。它將包含許多JSON對象。

JSON結構 -

{ 
    "name":"Mama Miya", 
    "phone":"9383883223", 
    "registeredTimestamp":"some-time", 
    "lastActiveTimestamp":"some-time", 
    "signinType":"facebook", 
    "additionalSigninData":{ 
     "key1":"value1", 
     "key2":"value2" 
    }, 
    "markedLocations":[ 
     { 
      "latitude":"77.33", 
      "longitude":"12.33", 
      "name":"Home", 
      "description":"my new home", 
      "placeid":"55334433", 
      "image":"url/abc.png" 
     } 
    ] 
} 

從應用程序,如果用戶訪問一個新的位置,我需要一個新的JSON對象添加到markedLocations。 所以markedLocations看起來應該是喜歡 -

"markedLocations":[ 
    { 
     "latitude":"77.33", 
     "longitude":"12.33", 
     "name":"Home", 
     "description":"my new home", 
     "placeid":"55334433", 
     "image":"url/abc.png" 
    },{ 
     "latitude":"22.11", 
     "longitude":"22.55", 
     "name":"Ocean", 
     "description":"Ocean", 
     "placeid":"32423423", 
     "image":"url/icean.png" 
    } 
] 

代碼/ Schema-

var item = { 
     'email': {'S': req.body.email}, 
     'phone': {'S': req.body.phone}, 
     'registeredTimestamp': {'S': req.body.registeredTimestamp}, 
     'lastActiveTimestamp': {'S': req.body.lastActiveTimestamp}, 
     'signinType': {'S': req.body.signinType}, 
     'version': {'S': req.body.version}, 
     'markedLocations': {'L': req.body.markedLocations} 
    }; 

我查 -

  • 在DynamoDB我怎麼使用元素添加到列表場Java link

  • 正在更新一個JSON數組中的AWS dynamoDB

  • 更新一組DB迪納摩使用節點的js link

  • 如何更新使用的NodeJS dynamoDB項目? link

  • 並檢查了AWS文檔UpdateItem API。我沒有發現任何與我的問題/疑問有關的事情。

請你能告訴我是否有方法可以在NodeJS中添加一個新的JSON對象的JSON數組?我不能繼續如何實施。

OR

我應該建立單獨的表爲每個陣列和具有電子郵件作爲主鍵和時間戳作爲排序鍵和前進? PS:我是DynamoDB的新手,我之前和MongoDB一起工作過,並且有辦法在那裏使用JSON數組和對象。無法在此找到方法。

+1

你知道如何做到這一點的Javascript?這就是你如何去做的。 Node.JS使用Javascript。 –

+0

@RobertHarvey號我不知道如何解決JS中的這個問題。整個AWS文檔都有使用Java,PHP和.Net的示例和API演示。我不確定要使用什麼API或如何構建代碼。我列出的StackOverflow問題根本沒有答案,或者主要是替換現有的值。我需要追加到現有的數組。 – bozzmob

+1

這聽起來像你正在試圖找到一個API或庫的地方爲一個簡單的操作,應該很容易在Javascript中完成。看看[這篇文章](http://stackoverflow.com/questions/4538269),特別是[這個答案](http://stackoverflow.com/a/4538314/102937)。你不需要NodeJS,Dynamo或其他任何東西來實現這一點。請注意,該帖子的作者犯了同樣的錯誤; *你不需要jQuery來做這件事。* –

回答

8

使用list_append() and if_not_exists()一起在UpdateExpression追加到一個潛在的不存在的名單列:

var AWS = require('aws-sdk') 
var DB = new AWS.DynamoDB.DocumentClient() 

function appendMarkedLocation (personId, location) { 
    return DB.update({ 
    TableName: 'people', 
    Key: { id: personId }, 
    ReturnValues: 'ALL_NEW', 
    UpdateExpression: 'set #markedLocations = list_append(if_not_exists(#markedLocations, :empty_list), :location)', 
    ExpressionAttributeNames: { 
     '#markedLocations': 'markedLocations' 
    }, 
    ExpressionAttributeValues: { 
     ':location': [location], 
     ':empty_list': [] 
    } 
    }).promise() 
} 

appendMarkedLocation('somePeronId', { 
    latitude: '22.11', 
    longitude: '22.55', 
    name: 'Ocean', 
    description: 'Ocean', 
    placeid: '32423423', 
    image: 'url/icean.png' 
}).then(console.log) 
+0

這正是我正在尋找的東西。將測試它並更新。非常感謝。 – bozzmob

+0

請你能告訴我什麼屬性類型應該用於數組中的每個對象?它應該是一個列表嗎? – bozzmob

+1

@bozzmob如果您正在使用DocumentClient,就像我在回答中一樣,那麼您根本不需要關心DyanmoDB內部類型。 DocumentClient會將'markedLocations'列表中的每個項目內部轉換爲Map類型。所以'markedLocations'最終會成爲地圖列表。 – idbehold