2016-05-26 14 views
0

habe ich einen Cloudant DB mit der folgenden Struktur:Suchen Eltern-ID in cloudant

{id: 1, resource:”john doe”, manager: “john smith”, amount: 13} 
{id: 2, resource:”mary doe”, manager: “john smith”, amount: 3} 
{id: 3, resource:”john smith”, manager: “peter doe”, amount: 10} 

ich eine Abfrage benötigt, um die Summe der Menge zurück, also habe ich eine Abfrage mit emit (doc.manager gebaut, doc.amount), die

kehrt
{"rows":[ 
{"key":"john smith","value":16}, 
{"key":"peter doe","value":10}]} 

Es ist wie ein Zauber funktioniert. Allerdings benötige ich die Manager-ID zusammen mit dem Manager-Namen. Das Ergebnis, das ich suche, ist:

{"rows":[ 
{"key":{"john smith",3},"value":16}, 
{"key":{"peter doe",null},"value":10}]} 

Wie soll ich eine Kartenansicht erstellen, um die Eltern-ID zu suchen? Ich glaube nicht, dass es eine Möglichkeit, genau das zu tun, was Sie in einer Abfrage wollen

Danke, Erik

Antwort

0

Leider. Vorausgesetzt, dass Sie die folgenden drei Dokumente in Ihrer Datenbank haben:

{ 
    "_id": "1", 
    "resource": "john doe", 
    "manager": "john smith", 
    "amount": 13 
} 

-

{ 
    "_id": "2", 
    "resource": "mary doe", 
    "manager": "john smith", 
    "amount": 3 
} 

-

{ 
    "_id": "3", 
    "resource": "john smith", 
    "manager": "peter doe", 
    "amount": 10 
} 

Die nächste Sache, was Sie wollen, wäre die folgende Map-Funktion (welches einen zusammengesetzten Schlüssel verwendet) und ein _sum reduzieren:

function(doc) { 
    emit([doc.manager, doc._id], doc.amount); 
} 

Dies würde Ihnen die folgenden Ergebnisse mit reduce=false geben:

{"total_rows":3,"offset":0,"rows":[ 
{"id":"1","key":["john smith","1"],"value":13}, 
{"id":"2","key":["john smith","2"],"value":3}, 
{"id":"3","key":["peter doe","3"],"value":10} 
]} 

Mit reduce=true und group_level=1, Sie im Wesentlichen die gleichen Ergebnisse wie das bekommen, was Sie bereits haben:

{"rows":[ 
{"key":["john smith"],"value":16}, 
{"key":["peter doe"],"value":10} 
]} 

Wenn Sie stattdessen reduce=true tun und group=true (genaue Gruppierung) dann erhalten Sie folgende Ergebnisse:

{"rows":[ 
{"key":["john smith","1"],"value":13}, 
{"key":["john smith","2"],"value":3}, 
{"key":["peter doe","3"],"value":10} 
]} 

Jede eindeutige Kombination der manager und _id Feld ist summiert, die leider nicht geben, was Sie wollen. Um das zu erreichen, was Sie erreichen wollen, halte ich es für das Beste, die Werte nach Abfrage der Datenbank zu summieren.

+0

Ich denke, Ihre Antwort ist großartig und gibt dem Benutzer genau das, was sie brauchen. Es scheint ein kleines Missverständnis über die IDs zu geben: Es gibt Dokument-IDs und Manager-IDs. Ich nehme an, jeder Manager hat eine eindeutige ID, auch wenn sie denselben Namen haben. Wenn im Dokument eine Manager-ID vorhanden ist, können Sie immer noch einen zusammengesetzten Schlüssel ausgeben, wie Sie im Beispiel gezeigt haben, und die Funktion '_sum' reduce verwenden - dies würde zu einem korrekten Verhalten führen, oder? – seb

+0

Sie könnten immer noch einen zusammengesetzten Schlüssel von '[doc.manager, doc.id]', ja verwenden. Ich denke jedoch, dass Sie immer noch auf dasselbe Problem stoßen werden, das ich oben skizziert habe. –