2016-03-03 5 views
1

J'ai un tableau multidimensionnel que je veux indexer avec CouchDB (en utilisant réellement Cloudant). J'ai des utilisateurs qui ont une liste des équipes auxquelles ils appartiennent. Je veux rechercher pour trouver chaque membre de cette équipe. Alors, obtenez-moi tous les objets Utilisateur qui ont un objet équipe avec l'ID 79d25d41d991890350af672e0b76faed. J'ai essayé de créer un index json sur "Teams.id", mais cela n'a pas fonctionné parce que ce n'est pas un tableau droit mais un tableau multidimensionnel.Comment indexer des tableaux multidimensionnels dans couchdb

utilisateur

{ 
"_id": "683be6c086381d3edc8905dc9e948da8", 
"_rev": "238-963e54ab838935f82f54e834f501dd99", 
"type": "Feature", 
"Kind": "Profile", 
"Email": "[email protected]", 
"FirstName": "George", 
"LastName": "Castanza", 
"Teams": [ 
    { 
    "id": "79d25d41d991890350af672e0b76faed", 
    "name": "First Team", 
    "level": "123" 
    }, 
    { 
    "id": "e500c1bf691b9cfc99f05634da80b6d1", 
    "name": "Second Team Name", 
    "level": "" 
    }, 
    { 
    "id": "4645e8a4958421f7d843d9b34c4cd9fe", 
    "name": "Third Team Name", 
    "level": "123" 
    } 
], 
"LastTeam": "79d25d41d991890350af672e0b76faed" 
} 

Répondre

4

C'est beaucoup comme ma réponse à Cloudant Selector Query mais voici l'affaire, appliquée à votre question:

La meilleure façon d'exécuter cette requête utilise « Cloudant requête » (ou « Mango », comme on l'appelle dans la prochaine version de CouchDB 2.0) - et non le système d'indexation traditionnel de MapReduce dans CouchDB. (Ce blog couvre les différences: https://cloudant.com/blog/mango-json-vs-text-indexes/ et celui-ci est un aperçu: https://developer.ibm.com/clouddataservices/2015/11/24/cloudant-query-json-index-arrays/).

Voici ce que votre indice de CQ devrait ressembler à:

{ 
    "index": { 
    "fields": [ 
     {"name": "Teams.[].id", "type": "string"} 
    ] 
    }, 
    "type": "text" 
} 

Et la question qui se ressemble:

{ 
    "selector": { 
    "Teams": {"$elemMatch": {"id": "79d25d41d991890350af672e0b76faed"}} 
    }, 
    "fields": [ 
    "_id", 
    "FirstName", 
    "LastName" 
    ] 
} 

Vous pouvez essayer vous-même dans la section « Requête » du tableau de bord Cloudant ou via boucle avec quelque chose comme ceci:

curl -H "Content-Type: application/json" -X POST -d '{"selector":{"Teams":{"$elemMatch":{"id":"79d25d41d991890350af672e0b76faed"}}},"fields":["_id","FirstName","LastName"]}' https://broberg.cloudant.com/teams_test/_find 

Cette base de données est lisible par tout le monde, de sorte que vous peut voir les exemples de documents que j'ai créé là-bas ici: https://broberg.cloudant.com/teams_test/_all_docs?include_docs=true

Creusez le thème Seinfeld: D

1

Vous devez simplement faire une boucle à travers le réseau des équipes et émettent une entrée de vue pour chacune des équipes.

function (doc) { 
    if(doc.Kind === "Profile"){ 
    for (var i=0; i<doc.Teams.length; i++) { 
     var team = doc.Teams[i]; 
     emit(team.id, [doc.FirstName, doc.LastName]); 
    } 
    } 
} 

Vous pouvez ensuite interroger pour tous les profils avec un identifiant spécifique de l'équipe en tapant sur l'équipe id comme celui-ci

.../view?key="79d25d41d991890350af672e0b76faed" 

donnant

{"total_rows":7,"offset":2,"rows":[ 
{"id":"0d15041f43b43ae07e8faa737f00032c","key":"79d25d41d991890350af672e0b76faed","value":["Adam","Alpha"]}, 
{"id":"68779729be3610fd8b52b22574000ae8","key":"79d25d41d991890350af672e0b76faed","value":["Bob","Bravo"]}, 
{"id":"9f97f1565f03aebae9ca73e207001ee1","key":"79d25d41d991890350af672e0b76faed","value":["Chuck","Charlie"]} 
]} 

ou vous pouvez inclure les profils réels en le résultat en ajoutant &include_docs=true à la requête.