此章節專注於第一種方式,如想了解第二種方式,請參見【聚合】章節。
後面的代碼引用自示例目錄【examples/query_examples/simple】,由Aerospike C客戶端安裝包自帶。
首先,初始化和構建一個的查詢對象。下面代碼片斷初始化了一個查詢對象,要查找的數據所在的namespace名稱為“test”、set名稱為“demoset”,查找bin名是 "test-bin"且整型值等於7的記錄。相當於SQL語句:“select * from test.demoset where test-bin equal 7”。
as_query query;
as_query_init(&query, "test", "demoset");
as_query_where_inita(&query, 1);
as_query_where(&query, "test-bin", integer_equals(7));
注意:不帶“where"語句的查詢將導致全庫掃描。
調用查詢
查詢使用aerospike_query_foreach()函數調用。
此調用為集群中每個節點初始化一個查詢任務。在C客戶端內部,有5個(NUM_QUERY_THREADS)查詢工作線程處理所有節點的查詢任務。若集群多於5個節點,理想狀態下是增加默認的處理線程數,以便讓全部節點並行處理。
if (aerospike_query_foreach(&as, &err, NULL, &query, query_cb, NULL) !=
AEROSPIKE_OK) {
LOG("aerospike_query_foreach() returned %d - %s", err.code, err.message);
as_query_destroy(&query);
cleanup(&as);
exit(-1);
}
若在指定的查詢目標上沒有創建次索引,將返回”AEROSPIKE_ERR_INDEX_NOT_FOUND“錯誤。若一個索引正在創建中,將返回AEROSPIKE_ERR_INDEX_NOT_READABLE錯誤。
處理結果
上面的示例中,aerospike_query_foreach()函數使用了一個回調函數query_cd做為參數。回調函數具有如下型構:
typedef bool (*aerospike_query_foreach_callback)(const as_val *value, void *udata);
對任何節點返回的每條記錄,回調函數都被調起,來對記錄進行處理。記錄處理沒有特定順序。你可能注意到參數value是個const as_val *類型,意味著回調函數沒有責任銷毀它,它在回調函數的作用域內可見。回調函數不應將它傳遞到作用域之外。
沒有更多需處理的返回結果時,將以空值(NULL)做為參數value的值,調用回調用函數。
當參數value期望是一個記錄時,可簡單地使用as_record_formval()轉換成記錄類型。若參數value是個記錄,此函數返回一個記錄對象;否則返回空值。也可使用as_val_type()檢查value的類型。
bool callback(const as_val *value, void *udata) {
if (value == NULL) {
// query is complete
return true;
}
as_record *rec = as_record_fromval(value);
if (rec != NULL) {
// process record
}
return true;
}
若想在每次回調時傳遞一個全局對象出來,請在調用aerospike_query_foreach()時提供一個userdata類型的參數。
清理資源
一旦查詢結束,查詢對象與其成員對象可使用as_query_destroy()函數安全地釋放。注意在我們的示例中,可以不用顯式調用as_query_destroy(),因為是從棧上分配的as_query對象,並且使用了as_query_where_inita(),來避免內部使用堆。