關(guān)于dynamodb中query之于分頁(yè)的做法娩践。

關(guān)于dynamodb中query之于分頁(yè)的做法

1里覆、首先介紹一下我的數(shù)據(jù)字段丧荐。
表名是homeworks,hash鍵設(shè)置為teacher_id喧枷,range鍵設(shè)置為id(一個(gè)由時(shí)間戳和隨機(jī)數(shù)組成的長(zhǎng)字串)

2篮奄、應(yīng)用場(chǎng)景是查詢某一個(gè)老師布置的作業(yè),query返回等操作被我包進(jìn)handler.query中割去。我在這個(gè)函數(shù)中進(jìn)行了報(bào)錯(cuò)的處理窟却,但是正常的返回值就是dynamodb的返回值。

3呻逆、首先想到的是使用query來(lái)進(jìn)行查詢夸赫,參數(shù)如下,其中teacher_id = 1咖城,limit = 5:
var reqParams = {
'TableName' : 'homeworks',
'IndexName' : 'teacher_id',
'Limit': para.limit,
'ProjectionExpression': "id, teacher_id",
'KeyConditionExpression': 'teacher_id = :v1',
'ExpressionAttributeValues': {
":v1": { "N": para.teacher_id },
},
}
if(para.offset != 0)
{
reqParams['ExclusiveStartKey'] = {
"teacher_id": { "N": para.teacher_id },
"id": { 'N': para.offset }
}
}
返回如下:
{"Items":[
{"id":{"N":"1494917803"},"teacher_id":{"N":"1"}},
{"id":{"N":"1494917858"},"teacher_id":{"N":"1"}},
{"id":{"N":"1494917915"},"teacher_id":{"N":"1"}},
{"id":{"N":"1494922586"},"teacher_id":{"N":"1"}},
{"id":{"N":"1494923540"},"teacher_id":{"N":"1"}}],
"Count":5,"ScannedCount":5,
"LastEvaluatedKey":{"id":{"N":"1494923540"},"teacher_id":{"N":"1"}}
}

4茬腿、然而當(dāng)我想要加入一個(gè)名為delstatus = 0的條件時(shí),將條件改為了:
'KeyConditionExpression': 'teacher_id = :v1 AND delstatus = :v3',
'ExpressionAttributeValues': {
":v1": { "N": para.teacher_id },
":v3": { "N": "0" }
},
發(fā)生了如下錯(cuò)誤:
ValidationException: Query condition missed key schema element: id
我對(duì)此的理解是宜雀,需要查詢除了兩個(gè)主鍵以外的數(shù)值的時(shí)候切平,兩個(gè)主鍵必須先被指定。
不過(guò)單獨(dú)查詢hash鍵也是可以的辐董。

5悴品、然后我嘗試更換了一個(gè)teacher_id,獲得數(shù)據(jù)如下:
{"Items":[
{"id":{"N":"14955108888001"},"teacher_id":{"N":"2"}},
{"id":{"N":"149551050797611"},"teacher_id":{"N":"2"}},
{"id":{"N":"149551232742291"},"teacher_id":{"N":"2"}},
{"id":{"N":"149551232910731"},"teacher_id":{"N":"2"}},
{"id":{"N":"149551233151301"},"teacher_id":{"N":"2"}}],
"Count":5,"ScannedCount":5
,"LastEvaluatedKey":{"id":{"N":"149551233151301"},"teacher_id":{"N":"2"}}
}

6、當(dāng)我分別將offset替換為L(zhǎng)astEvaluatedKey的返回值時(shí)苔严,(3)和(5)也是一切正常的定枷。

7、因?yàn)橐欢ㄒ付ㄖ麈I值届氢,所以我決定加入一個(gè)id > offset的條件:
'KeyConditionExpression': 'teacher_id = :v1 AND id > :v2 AND delstatus = :v3',
'ExpressionAttributeValues': {
":v1": { "N": para.teacher_id },
":v2": { "N": para.offset },
":v3": { "N": "0" }
},
執(zhí)行后收到報(bào)錯(cuò):
Conditions can be of length 1 or 2 only
這時(shí)候我才發(fā)現(xiàn)這個(gè)參數(shù)的名字是KeyConditionExpression欠窒,也就是只能查詢key的,也就是說(shuō)其他的value要用別的參數(shù)查詢退子。

8岖妄、查詢文檔,看到有這樣兩個(gè)參數(shù):
"FilterExpression": "string",
"ExpressionAttributeValues": {
"string" : {
"B": blob,
"BOOL": boolean,
"BS": [ blob ],
"L": [
"AttributeValue"
],
"M": {
"string" : "AttributeValue"
},
"N": "string",
"NS": [ "string" ],
"NULL": boolean,
"S": "string",
"SS": [ "string" ]
}
},
于是將參數(shù)更改為:
'KeyConditionExpression': 'teacher_id = :v1',
"FilterExpression": "delstatus = :v3",
'ExpressionAttributeValues': {
":v1": { "N": para.teacher_id },
":v3": { "N": '0' }
},
但所獲得的卻是:
{"Items":[],
"Count":0,"ScannedCount":5,
"LastEvaluatedKey":{"id":{"N":"1494923540"},"teacher_id":{"N":"1"}}
}
對(duì)于這個(gè)我產(chǎn)生了一些疑惑寂祥,明明沒(méi)有查詢到數(shù)據(jù)為什么還有LastEvaluatedKey荐虐。
后來(lái)我稍微想明白了一點(diǎn),就是這個(gè)filter和limit的意思壤靶。
是先limit出來(lái)5條缚俏,然后再在這5條中進(jìn)行filter惊搏,因?yàn)樵萳imit出來(lái)的5條里沒(méi)有teacher_id=1的贮乳,所以自然是空的。
我試著將teacher_id改成了2恬惯,items里就有內(nèi)容了向拆。
但是這個(gè)參數(shù)依舊不是我想要的效果。

9酪耳、我懷疑過(guò)參數(shù)的排序浓恳,但是即使將limit參數(shù)放到最后也沒(méi)有影響,可見(jiàn)是沒(méi)有關(guān)系的碗暗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颈将,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子言疗,更是在濱河造成了極大的恐慌晴圾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噪奄,死亡現(xiàn)場(chǎng)離奇詭異死姚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)勤篮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門都毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碰缔,你說(shuō)我怎么就攤上這事账劲。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵涤垫,是天一觀的道長(zhǎng)姑尺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝠猬,這世上最難降的妖魔是什么切蟋? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮榆芦,結(jié)果婚禮上柄粹,老公的妹妹穿的比我還像新娘。我一直安慰自己匆绣,他們只是感情好驻右,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著崎淳,像睡著了一般堪夭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拣凹,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天森爽,我揣著相機(jī)與錄音,去河邊找鬼嚣镜。 笑死爬迟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菊匿。 我是一名探鬼主播付呕,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跌捆!你這毒婦竟也來(lái)了徽职?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤佩厚,失蹤者是張志新(化名)和其女友劉穎姆钉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體可款,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡育韩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闺鲸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筋讨。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摸恍,靈堂內(nèi)的尸體忽然破棺而出悉罕,到底是詐尸還是另有隱情赤屋,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布壁袄,位于F島的核電站类早,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗜逻。R本人自食惡果不足惜涩僻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栈顷。 院中可真熱鬧逆日,春花似錦、人聲如沸萄凤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)靡努。三九已至坪圾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惑朦,已是汗流浹背兽泄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留行嗤,地道東北人已日。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓垛耳,卻偏偏與公主長(zhǎng)得像栅屏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子南蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容