Đây là những gì tôi đã đưa ra cho đến nay - để có được id của tất cả các bài viết, sau đó lấy các mặt hàng thực tế cho số x đầu tiên của ID ..
Nó không phải terribly hiệu quả, nhưng nhiều hơn so với truy xuất tất cả các bài đăng, sau đó ném hầu hết mọi thứ. Điều đó nói rằng, với sự ngạc nhiên của tôi, nó dường như chạy khá nhanh - tôi chạy phương thức posthelper.page()
100 lần và mất khoảng 0,5 giây.
Tôi không muốn đăng bài này trong câu hỏi thực tế, vì vậy nó sẽ không ảnh hưởng đến câu trả lời càng nhiều - đây là các mã:
allPostsUuid = """
function(doc) {
if(doc.type == 'post'){
emit(doc._id, null);
}
}
"""
class PostsHelper:
def __init__(self):
server = Server(config.dbhost)
db = server[config.dbname]
return db
def _getPostByUuid(self, uuid):
return self.db.get(uuid)
def page(self, number = 1):
number -= 1 # start at zero offset
start = number * config.perPage
end = start + config.perPage
allUuids = [
x.key for x in self.db.query(allPostsUuid)
]
ret = [
self._getPostByUuid(x) for x in allUuids[start : end]
]
if len(ret) == 0:
raise Error404("Invalid page (%s results)" % (len(allUuids)))
else:
return ret
Sự cố với aproach này là bạn không thể thực sự nhấp vào nhiều lần trước đó, chỉ một lần. Bạn phải tự lập chỉ mục TẤT CẢ trang đầu tiên có thể có trong trang khi bạn truy cập các trang tiếp theo hoặc bạn chỉ có thể quay lại 1 trang và sau đó bạn không có bất kỳ thông tin nào để đi trước một trang khác. – for3st
Đối với những người vấp ngã ở đây và cũng chạy vào tình trạng khó xử của @ for3st, các đặc tính tự nhiên của một mảng giúp khắc phục vấn đề này. Bởi 'push()' ing trang trước bắt đầu '_id' thành mảng, bạn có thể dễ dàng' pop() 'mảng' _id' khi bạn bấm vào trước đó. Hầu hết tất cả những gì bạn phải làm là theo dõi là một mảng các số nguyên. – wootencl