2016-01-27 20 views
6

Tôi đang sử dụng RemoteAPI (Java) để trải qua một tập dữ liệu lớn, ~ 90K thực thể và thực hiện một số di chuyển dữ liệu.Truy vấn Datastore với giới hạn

int CHUNK_SIZE = 500; 
int LIMIT = 900; 

QueryResultList<Entity> result = ds.prepare(entityQuery) 
.asQueryResultList(
    FetchOptions.Builder 
    .withPrefetchSize(CHUNK_SIZE) 
    .limit(LIMIT) 
    .chunkSize(CHUNK_SIZE) 
).startCursor(cursor); 

Với các thiết lập truy vấn LIMIT-900 các result.size() là toàn bộ dữ liệu, ~ 90k, thay vì 900. Nếu tôi thử thấp hơn LIMIT, hãy nói 300, kích thước kết quả là kích thước mong đợi (300).

tôi thiếu gì ở đây? Từ tài liệu, tôi không thể tìm ra lý do tại sao nó tạo ra hành vi mà tôi mô tả ở đây.

+1

Tôi có thể nói điều gì đó ngu ngốc nhưng bạn đã thử thay đổi thứ tự các lựa chọn của mình chưa? FetchOptions.Builder.withLimit (LIMIT) .withPrefetchSize (CHUNK_SIZE) .chunkSize (CHUNK_SIZE) ) .startCursor (con trỏ); – yannicksoldati

+0

Sửa lỗi nếu tôi sai nhưng tôi không thấy phương thức '.limit' trong Tóm tắt Phương thức cho đối tượng' FetchOptions.Builder' (xem: https://cloud.google.com/appengine/docs /java/javadoc/com/google/appengine/api/datastore/FetchOptions.Builder). Nên thay '.withLimit'. –

Trả lời

0

Dựa trên những ví dụ (http://www.programcreek.com/java-api-examples/index.php?api=com.google.appengine.api.datastore.QueryResultList)

Tôi nghĩ rằng bạn nên sử dụng .withLimit(LIMIT) thay vì .limit(LIMIT) trong .asQueryResultList tùy chọn

Vì vậy, tôi sẽ tái cấu trúc mã của bạn như sau:

FetchOptions options = FetchOptions.Builder 
    .withLimit(LIMIT) 
    .withPrefetchSize(CHUNK_SIZE) 
    .chunkSize(CHUNK_SIZE); 

QueryResultList<Entity> result = ds.prepare(entityQuery) 
    .asQueryResultList(options); 

Sau đó, nhận con trỏ

result.getCursor(); 
Các vấn đề liên quan