Встроенный способ прочитать размер документа couchdb? - PullRequest
3 голосов
/ 14 января 2012

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

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

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

Ответы [ 3 ]

9 голосов
/ 14 января 2012

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

function (doc) {
    emit(doc._id, JSON.stringify(doc).length);
}
6 голосов
/ 18 января 2012

Вы можете сделать запрос 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 кодовых единиц в строке.

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

0 голосов
/ 05 июня 2017

На основании принятого ответа я предлагаю следующее улучшение:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...