2012-01-14 4 views
3

J'expérimente avec l'utilisation de couchdb comme un magasin de message et voudrais signaler la taille de message.Construit de manière à lire la taille du document couchdb?

Idéalement, il serait agréable de lire un attribut _size. Au pire, je pourrais vérifier la longueur de chaîne de JSON du document entier. Je peux même vouloir utiliser la taille comme une clé de vue.

Selon vous, quelle est la meilleure façon d'enregistrer la taille du document et pourquoi pensez-vous que cette méthode est la meilleure?

Répondre

9

Vous pourriez faire une vue;

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

y a-t-il une façon d'inclure des tailles de pièces jointes? –

+0

Attention: ce n'est pas la longueur en octets. C'est le [nombre de points de code utf-16] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length). –

+0

Est-ce que cette valeur 'longueur' inclut' ._attachments'? – Armand

6

Vous pouvez faire une demande HEAD:

$ curl -X HEAD -I http://USER:[email protected]: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 

L'en-tête Content-Length contient la longueur en octets du document. C'est très rapide car vous n'avez pas besoin de télécharger le document complet.

Mais il y a une mise en garde: Content-Length est le nombre de octets de la version utf-8 du document (voir l'en-tête Content-Type); String.length est le nombre d'unités de code utf-16 de 16 bits dans une chaîne. En d'autres termes, ils comptent différentes choses, des octets par rapport aux unités de code, de différents codages du document, utf-8 par rapport à utf-16.

+0

C'est aussi une bonne réponse. Puisque je veux savoir pour pouvoir utiliser la taille dans un index, je préfère l'autre réponse cette fois. –

+0

@Marcello Bonne réponse, mais une petite chose - sont tous les points de code utf-16 vraiment 16 bits? – Armand

+0

@Armand AFAIK, oui (je ne suis pas un expert en Unicode). Mais certains caractères sont représentés par plus d'un point de code. Ceci est expliqué clairement dans la documentation de [String.length] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length). –

0

Sur la base de la réponse acceptée, je suggère l'amélioration suivante:

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

Cela présente les avantages suivants:

  • longueur doc comme la première partie clé vous permet de trier par taille du document. Doc id comme seconde pièce clé garantit que les documents de même taille apparaissent comme des entrées séparées. Doc id dans la partie valeur facilite la copie de l'ID dans le futon (car la partie clé vous donne un pointeur de lien à cet endroit).

Questions connexes