2009-09-23 7 views
10

Le problème sous-jacent - disons que mes documents ont "catégories" et timestamps. Si je veux tous les documents du « foo » catégorie qui ont un horodatage qui est au cours des deux dernières heures, il est simple:Plusieurs plages de clés en tant que paramètres d'une vue CouchDB

function (doc) { 
    emit([doc.category, doc.timestamp], null); 
} 

puis requête comme

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|] 

le problème vient quand je veulent quelque chose dans les catégories foo ou barre, dans les deux dernières heures. Si je ne me souciais pas de temps, je pourrais juste tirer directement par clé à travers la collection de clés. Malheureusement, je n'ai pas une telle option avec des plages.

Ce que je fini par faire dans l'intervalle est arrondi l'horodatage des blocs de deux heures, puis multiplexer la requête sur:

POST server:5894/.../myview 
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]] 

Il fonctionne, mais être gênant si je veux revenir un beaucoup de temps (par rapport à la taille de bloc).

Existe-t-il un moyen d'envoyer plusieurs paires startKey/endKey à une vue, comme les clés: [] tableau qui peut être affiché pour les clés?

Répondre

4

Vous feriez probablement mieux de faire deux requêtes. CouchDB peut très bien gérer plusieurs requêtes simultanées, donc il faut séparer plusieurs processus/threads et interroger les docs foo et bar séparément.

CouchDB ne prend actuellement pas en charge plusieurs requêtes de plage. Les clés ORing et ANDing ne sont pratiquement pas réalisables dans une requête.

+0

bien que vous pouvez OU touches à travers les messages post, mais oui. Merci. – kolosy

9

Il existe une demande d'émission de CouchDB pour vous permettre de le faire. J'ai joint un correctif simple, sans garantie à 0.10.1 à ce billet qui peut fonctionner pour vous. Il fonctionne pour moi et me permet de faire des choses comme:

{ 
    "keys": [ 
     { 
      "startkey": ["0240286524","2010","03","01"], 
      "endkey": ["0240286524","2010","03","07",{}] 
     }, 
     { 
      "startkey": ["0442257276","2010","03","01"], 
      "endkey": ["0442257276","2010","03","07",{}] 
     } 
    ] 
} 

dans le corps POST, ce qui me permet d'obtenir toutes les données sur plusieurs ids de suivi, pour une plage de dates. J'appelle avec group=true&group_level=1 pour regrouper les résultats par identifiant de suivi. Les niveaux de groupe plus profonds me permettraient de grouper par le suivi id | année, suivi id | année | mois etc.

Plusieurs connexions étaient un frais généraux non modifiable pour moi comme je chercherais à faire simultanément 2000 :) (Non, un nouvelle vue n'est pas une option - nous sommes déjà à 400 Go pour les données plus une vue!)

Le problème et le correctif sont à https://issues.apache.org/jira/browse/COUCHDB-523.

3

Ceci a été ajouté dans les versions plus récentes de CouchDB. Pour ajouter plusieurs plages de touches de début/fin, vous pouvez utiliser une requête POST à ​​votre point de vue, avec un corps qui ressemble à ceci:

{ 
    "queries": [ 
    { "startkey": 10, "endkey": 11 }, 
    { "startkey": 16, "endkey": 18 } 
    ] 
} 

Je sais que c'est une vieille question, mais j'ai d'abord trouvé quand j'étais Je cherche exactement ça!

+0

Des références de document pour ceci? – Isaac

+0

Pas encore, j'ai promis de patcher les docs car nous ne les avons pas encore! Je l'ai blogué si un autre exemple serait utile https: // lornajane.net/posts/2017/multiple-search-keys-in-couchdb –

+0

Ah, j'ai trouvé que les docs de l'API existent déjà, ils sont là: http://docs.couchdb.org/fr/2.0.0/api /ddoc/views.html#sending-multiple-queries-to-a-view –

Questions connexes