關(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)系的碗暗。