Мое решение сравнивает объекты, а не массивы. Это будет работать так же, как 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;
}
Надеюсь, это поможет вам или кому-либо еще найти ответ.
API Представления CouchDB HTTP дает много объема, чтобы сделать подкачку страниц эффективно.
самый простой метод использовал бы startkey
и count
. Количество является макс. количеством записей, которые CouchDB возвратит для того запроса представления, что-то, что является до Вашего дизайна, и startkey - то, где Вы хотите, чтобы CouchDB запустился. Когда Вы запросите представление, оно также скажет Вам сколько записей, там, позволяя Вам вычислить сколько страниц, там будет то, если Вы захотите показать это пользователям.
, Таким образом, первый запрос не определил бы startkey, просто счет для количества записей, которые Вы хотите показать. Можно тогда отметить ключ последней возвращенной записи и использование что как ключ запуска для следующей страницы. В этой простой форме Вы получите перекрытие, где последняя запись одной страницы является первой из следующего. Если это не желательно, чтобы это было тривиально только к не, отображают последнюю запись страницы.
А более простой метод выполнения это должно использовать параметр пропуска для разработки стартового документа для страницы, однако этот метод должен использоваться с осторожностью. Параметр пропуска просто заставляет внутренний механизм не возвращать записи, которых это выполняет итерации. В то время как это дает желаемое поведение, это намного медленнее, чем нахождение первого документа для страницы ключом. Чем больше документов, которые пропускаются, тем медленнее запрос будет.
Это - то, что я имею, придумал до сих пор - чтобы получить идентификаторы всех сообщений, затем получить фактические объекты для первого 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