2014-09-04 4 views
0

Je suis en train de tirer des scores de retour de ce point de vuevaleurs tri CouchDB

"scores": { 
    "map": "function(doc) { emit(doc.appName, {_id:doc.username, username:doc.username, credits:doc.credits, avatar:doc.avatar}) }" 
}, 

Je passe dans la appname et renvoie les scores. Le problème est que les scores ne seront pas triés correctement. Lorsque je tente de les trier ils ne sorte par le premier chiffre donc quelque chose comme si

1500 
50 
7 
900 

Comme vous pouvez le voir les premiers chiffres sont classés ASC mais le nombre entier lui-même est pas. Est-il possible d'avoir couchdb trier les scores si le nom de l'application est la clé?

Répondre

1

est doc.appName une chaîne? Tourner dans un numéro:

function(doc) { 
    emit(parseInt(doc.appName), {_id:doc.username, username:doc.username, credits:doc.credits, avatar:doc.avatar}); 
    // ^^^^^^^^ 
} 
+0

Oui, c'est une chaîne, il est utilisé pour identifier ce que app l'utilisateur tente d'extraire les scores de – Dave

+0

couchdb trie les chaînes de manière cohérente pour toutes les chaînes, c'est-à-dire dans l'ordre lexicographique (ie, dictionnaire). il fait trier les nombres numériquement. – SingleNegationElimination

0

Utilisez une clé complexe:

emit([doc.appName, doc.score], null) 

en utilisant ensuite la requête une gamme:

startkey=["app1", 0]&endkey=["app1", {}]