2016-10-22 66 views
0

所以我在dynamodb一個數據庫中的一些項目,它看起來有點像這樣,其中name是主鍵列表解析在boto3爲Dynamodb

'name': {'S': 'bob'}, 
'users': {'L': [ 
    {'M': { 
     'user_id': {'S': 'xxx'}, 
     'share': {'N': '1'}}}, 
    {'M': { 
     'user_id': {'S': 'yyy'}, 
     'share': {'N': '4'}}}]} 

現在我的問題是,用戶是字典列表,並且我想知道是否有任何方法可以掃描該表以獲取name,當該用戶列表中存在特定的user_id時。

我知道在Python我會做一個列表理解,只是得到一個user_id的列表,然後只是做一個user_id in [user['user_id'] for user in users]這將是測試,但我不知道如何在DynamoDB中做到這一點掃描FilterExpression

我只是試圖避免需要對項目看起來像這樣:

'name': {'S': 'bob'}, 
'users': {'L': [ 
    {'M': { 
     'user_id': {'S': 'xxx'}, 
     'share': {'N': '1'}}}, 
    {'M': { 
     'user_id': {'S': 'yyy'}, 
     'share': {'N': '4'}}}]} 
'user_ids': {'L': [ 
    {'S': 'xxx'}, 
    {'S': 'yyy'}]} 

,因爲這感覺就像一個所謂的「代碼味道」。但是,這將解決問題,因爲過濾器表達式只是:user_id in user_ids

回答

1

DynamoDB沒有功能來過濾列表數據類型中的Map中的數據。用戶列表具有用戶標識和共享屬性。如果您知道用戶標識和共享的值,則可以使用運算符來過濾數據。

請注意,正如您在OP中提到的,DynamoDB中的IN運算符不能像那樣使用。請參閱下面的描述。

IN:檢查兩組內的匹配元素。

AttributeValueList可以包含一個或多個String類型的AttributeValue元素, 數字或二進制(不是集合類型)。將這些屬性與項目的現有設置類型屬性進行比較 。如果 的任何元素的輸入集存在於項目屬性中,則表達式 的計算結果爲true。

var params = { 
     TableName: "tablenames",  
     FilterExpression: "contains (#users, :usersDetails)", 
     ExpressionAttributeNames: { '#users' : 'users'}, 
     ExpressionAttributeValues: { 
      ":usersDetails": {'user_id' : 'xxx', 'share' : 1} 

     } 
}; 
+0

有沒有辦法做到這一點,如果我沒有'share'價值?還要感謝IN操作員的注意事項。沒意識到! –

+0

不幸的是,沒辦法。 – notionquest

+0

嗯,好的,謝謝! @notionquest –