2016-02-23 4 views
5

मैं केवल उपयोगकर्ता तालिका में सम्मिलित करना चाहता हूं यदि उपयोगकर्ता आईडी, ईमेल और उपयोगकर्ता नाम मौजूद नहीं है (यह अद्वितीय होना चाहते हैं)।
उपयोगकर्ता आईडी प्राथमिक कुंजी है (हैश कुंजी, डेटा प्रकार - संख्या)।
उपयोगकर्ता नाम और ईमेल गैर-महत्वपूर्ण विशेषताएं (दोनों स्ट्रिंग) हैं।कंडीशनएक्सप्रेस का उपयोग करके डायनेमोड में गैर-कुंजी विशेषता पहले से मौजूद है या नहीं?

यहाँ मैं कैसे की कोशिश की है:

response = userTable.put_item(
Item={ 
    'userId': userIdNext, 
    'accType': 0, 
    'username': usernameInput, 
    'pwd': hashedPwd, 
    'email': emailInput 
}, 
ConditionExpression = "(attribute_not_exists(userIdNext)) AND (NOT (contains (email, :v_email))) AND (NOT (contains(username, :v_username)))", 
ExpressionAttributeValues={ 
    ":v_email": emailInput, 
    ":v_username": usernameInput 
} 
) 

मैं यहाँ से तार्किक ऑपरेटरों और हालत अभिव्यक्ति के लिए एडब्ल्यूएस दस्तावेज़ का पालन करने की कोशिश की: AWS Conditional Expressions

लेकिन यह तालिका में हर डालने है, भले ही उपयोगकर्ता नाम या ईमेल डीबी में पहले से मौजूद है।

(मैं नया userIdNext यह प्राथमिक कुंजी के रूप में और एक नकली नहीं हो सकता दे रहा हूँ) मैं अजगर implemetation उपयोग कर रहा हूँ boto3

उत्तर

4

dynamodb केवल हैश दूरी तालिका चाबी के लिए विशिष्टता (और के लिए नहीं मजबूर कर सकते हैं वैश्विक माध्यमिक सूचकांक कुंजी)

अपने मामले में

2 विकल्प हैं:

1) आवेदन स्तर पर उसे बलपूर्वक - रिकॉर्ड के लिए क्वेरी, और अगर नकल लगता है

2), (कि uniqeness लागू कर सकते हैं) हैश/रेंज मूल्यों के साथ एक और dynamodb तालिका जोड़ने आप इस तालिका को क्वेरी कर सकता मुख्य तालिका

3) के लिए एक आइटम डालने से पहले आवेदन ताले (का उपयोग मेम्कैश ..)

4) न dynamodb का उपयोग (शायद अपनी अपनी आवश्यकताओं का जवाब नहीं)

यहाँ उत्तर देने के लिए आप बात कर:

DynamoDB avoid duplicate non-key attributes

DynamoDB consistent reads for Global Secondary Index

+0

मैं उपयोगकर्ता नाम या ईमेल पहले से मौजूद है, तो जाँच करने के लिए वैश्विक माध्यमिक इंडेक्स है, लेकिन इसकी नहीं की डुप्लिकेट प्रविष्टियां है परमाणु। तो यदि 2 उपयोगकर्ता एक ही समय में पूछते हैं और वह ईमेल 1 उपलब्ध है, तो वे दोनों उपयोगकर्ता तालिका में डालते हैं। और यदि सत्यापित करने के लिए कोई जांच नहीं है कि ईमेल/उपयोगकर्ता नाम पहले से मौजूद नहीं है, तो हमारे पास ईमेल/उपयोगकर्ता नाम के लिए डुप्लिकेट प्रविष्टियां हैं – kishorer747

+0

मैंने जवाब संपादित किया। इस मामले में आपको एप्लिकेशन लॉक (उदाहरण के लिए memcache) –

+0

हाँ का उपयोग करना चाहिए, मेरे पास एक अलग तालिका है जो उपयोगकर्ता नाम और ईमेल दोनों के लिए विशिष्टता की जांच करती है। लेकिन ऐसे मामलों में जब 2 उपयोगकर्ता एक ही समय में पंजीकरण करने का प्रयास करते हैं एक ही ईमेल/उपयोगकर्ता नाम, यह भी वाईआई डालने जा रहा है वांछित वें। धन्यवाद। मैं ताले में देखता हूँ। – kishorer747

1

ठीक है, मुझे अपने आवेदन में बग मिला।

मैं डायनामो डीबी को एक सशर्त पुट आइटम करने की कोशिश कर रहा हूं लेकिन मैं डायनेमो डीबी पर मौजूद एक अलग प्राथमिक कुंजी गुजर रहा हूं, इस बिंदु पर एक नई वस्तु बनाई जाएगी और सशर्त अभिव्यक्ति को नजरअंदाज कर दिया जाएगा।

# id primary key 
id = 123 
# email is only index 
email = "[email protected]" 

item = { 
    "id": id, 
    "email": email 
    "info": { 
    "gender": "male", 
    "country": "Portugal" 
    } 
} 

response = self._table.put_item(Item=item, ConditionExpression="email <> :v_email", ExpressionAttributeValues={":v_email": email}) 

यदि आप चाहते हैं कि सशर्त भाव DynamoDB पर ठीक से काम put_item आप एक है कि डीबी पर मौजूद है की एक ही प्राथमिक कुंजी भेजना चाहिए।

किशोरोर 747, क्या आप अपने कोड का नमूना डाल सकते हैं जो ऐसा करते हैं? "मेरे पास वैश्विक माध्यमिक इंडेक्स है यह जांचने के लिए कि उपयोगकर्ता नाम या ईमेल पहले से मौजूद हैं, लेकिन यह परमाणु नहीं है। इसलिए यदि 2 उपयोगकर्ता एक ही समय में पूछते हैं और प्राप्त करें कि वह ईमेल 1 उपलब्ध है, तो वे दोनों उपयोगकर्ता तालिका में सम्मिलित हैं।और अगर वहाँ अगर ईमेल/उपयोगकर्ता नाम पहले से ही मौजूद नहीं है सत्यापित करने के लिए कोई जांच है, हम ईमेल/उपयोगकर्ता नाम "

+0

आप इस तरह अपना ध्यान पाने के लिए उपयोगकर्ता का उल्लेख कर सकते हैं: @malmeida हैलो! लेकिन आपको टिप्पणी में यह करना चाहिए। – yuyoyuppe

संबंधित मुद्दे