Разбиение на страницы в CouchDB?

Мое решение сравнивает объекты, а не массивы. Это будет работать так же, как Tomáš as Arrays - это объекты, но без предупреждения:

Object.prototype.compare_to = function(comparable){

    // Is the value being compared an object
    if(comparable instanceof Object){

        // Count the amount of properties in @comparable
        var count_of_comparable = 0;
        for(p in comparable) count_of_comparable++;

        // Loop through all the properties in @this
        for(property in this){

            // Decrements once for every property in @this
            count_of_comparable--;

            // Prevents an infinite loop
            if(property != "compare_to"){

                // Is the property in @comparable
                if(property in comparable){

                    // Is the property also an Object
                    if(this[property] instanceof Object){

                        // Compare the properties if yes
                        if(!(this[property].compare_to(comparable[property]))){

                            // Return false if the Object properties don't match
                            return false;
                        }
                    // Are the values unequal
                    } else if(this[property] !== comparable[property]){

                        // Return false if they are unequal
                        return false;
                    }
                } else {

                    // Return false if the property is not in the object being compared
                    return false;
                }
            }
        }
    } else {

        // Return false if the value is anything other than an object
        return false;
    }

    // Return true if their are as many properties in the comparable object as @this
    return count_of_comparable == 0;
}

Надеюсь, это поможет вам или кому-либо еще найти ответ.

43
задан dbr 23 November 2008 в 15:37
поделиться

2 ответа

API Представления CouchDB HTTP дает много объема, чтобы сделать подкачку страниц эффективно.

самый простой метод использовал бы startkey и count. Количество является макс. количеством записей, которые CouchDB возвратит для того запроса представления, что-то, что является до Вашего дизайна, и startkey - то, где Вы хотите, чтобы CouchDB запустился. Когда Вы запросите представление, оно также скажет Вам сколько записей, там, позволяя Вам вычислить сколько страниц, там будет то, если Вы захотите показать это пользователям.

, Таким образом, первый запрос не определил бы startkey, просто счет для количества записей, которые Вы хотите показать. Можно тогда отметить ключ последней возвращенной записи и использование что как ключ запуска для следующей страницы. В этой простой форме Вы получите перекрытие, где последняя запись одной страницы является первой из следующего. Если это не желательно, чтобы это было тривиально только к не, отображают последнюю запись страницы.

А более простой метод выполнения это должно использовать параметр пропуска для разработки стартового документа для страницы, однако этот метод должен использоваться с осторожностью. Параметр пропуска просто заставляет внутренний механизм не возвращать записи, которых это выполняет итерации. В то время как это дает желаемое поведение, это намного медленнее, чем нахождение первого документа для страницы ключом. Чем больше документов, которые пропускаются, тем медленнее запрос будет.

13
ответ дан Kerr 23 September 2019 в 13:06
поделиться

Это - то, что я имею, придумал до сих пор - чтобы получить идентификаторы всех сообщений, затем получить фактические объекты для первого x количества идентификаторов..

Это не ужасно эффективно, но больше, чем получение всех сообщений, затем бросая большую часть далеко. Однако к моему удивлению это, казалось, работало вполне быстро - я работал posthelper.page() метод 100 раз, и потребовалось приблизительно 0,5 секунды.

я не хотел отправлять это в фактическом вопросе, таким образом, он не будет влиять на ответы так же - вот код:

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
1
ответ дан dbr 23 September 2019 в 13:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: