Встроенный способ читать размер документа couchdb?

76
7

Я экспериментирую с использованием couchdb в качестве хранилища сообщений и хочу сообщить размер сообщения.


В идеале было бы неплохо прочитать атрибут _size. В худшем случае я мог проверить длину строки всего документа JSON. Я даже хочу использовать размер в качестве ключа вида.


Как вы думаете, лучший способ записать размер документа и почему вы считаете, что этот метод лучше?

спросил(а) 2012-01-14T21:27:00+04:00 8 лет, 5 месяцев назад
1
Решение
57

Основываясь на принятом ответе, я предлагаю следующее улучшение:


function (doc) {
emit([JSON.stringify(doc).length, doc._id], doc._id);
}

Это имеет следующие преимущества:


    длина документа в качестве первой ключевой части позволяет сортировать по размеру документа.


    doc id в качестве второй ключевой части гарантирует, что документы с одинаковым размером отображаются как отдельные записи.


    doc id в части значений упрощает копирование идентификатора во фьютоне (поскольку ключевая часть дает вам указатель ссылки).


ответил(а) 2017-06-05T04:19:00+03:00 3 года назад
122

Вы можете сделать представление;

function (doc) {
emit(doc._id, JSON.stringify(doc).length);
}

ответил(а) 2012-01-14T22:04:00+04:00 8 лет, 5 месяцев назад
101

Вы можете сделать запрос HEAD:


$ curl -X HEAD -I http://USER:PASS@localhost:5984/db/doc_id
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R14B03)
Etag: "1-c0b6a87a64fa1b1f63ee2aa7828a5390"
Date: Tue, 17 Jan 2012 21:32:43 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 740047
Cache-Control: must-revalidate

Заголовок Content-Length содержит длину в байтах документа. Это очень быстро, потому что вам не нужно загружать полный документ.

Но есть оговорка: Content-Length - это количество байтов версии документа utf-8 (см. заголовок Content-Type); String.length - это число 16-разрядных единиц кода utf-16 в строке.


i.e, они подсчитывают разные вещи, байты и единицы кода, разных кодировок документа, utf-8 и utf-16.

ответил(а) 2012-01-18T00:37:00+04:00 8 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема