2014-12-27 6 views
7

Ist es möglich, den Array-Index beim Abwickeln eines Arrays (http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind) mithilfe der MongoDB-Aggregation-Pipeline zugreifen?Projizieren Array-Index nach dem Abwickeln eines Arrays mit MongoDB-Aggregation Framework

Angenommen, ich Abwickeln dieses Dokument in der Sammlung "c":

{_id: 1, elements: ["a", "b", "c"]} 

dieser Vorgang dann:

db.c.aggregate([ 
{$unwind: "$elements"} 
]) 

einen Cursor für Dokumente zurück:

[ 
{_id: 1, elements: "a"}, 
{_id: 1, elements: "b"}, 
{_id: 1, elements: "c"} 
] 

Ich möchte später herausfinden, dass "a" hatte den Index 0, "b" hatte den Index 1 und "c" hatte den Index "2" in der ursprünglichen Anordnung vor dem Abwickeln.

Wie kann ich den Array-Index in einem Abwicklungsvorgang projizieren?

Antwort

4

Derzeit scheint dies mit dem Aggregation Framework nicht möglich zu sein. Es ist ein ungelöstes offenes Problem damit verbunden: https://jira.mongodb.org/browse/SERVER-4588.

Als Workaround können Sie Map-reduce verwenden, wobei die Kartenfunktion jedem Array-Element einen Index zuweist.

+0

Vielen Dank! Ich hatte den Eindruck, dass es nicht möglich war, da ich jetzt Beispiele sah und keinen Operator fand, der den Index projizierte. Aber ich habe diesen Problembericht noch nicht gefunden. Vielen Dank! –

+1

Sie sind herzlich willkommen. Eine Kombination von Operatoren '$ let' und' $ map' kann uns in die Nähe von projektmanipulierten Werten bringen, aber aufgrund ihrer Bereichsbeschränkungen kann eine inkrementelle Indexierung nicht erreicht werden. – BatScream

+0

Mir ist bewusst, dass man mit map/reduce praktisch alles innerhalb der Grenzen der map/reduce-Implementierung machen kann. Eine Sache, die mich immer wieder verwirrt, ist, sicherzustellen, dass das Kartenergebnis nicht zu groß wird. In Bezug auf das vorliegende Problem, denke ich, dass JIRA Fall einen vernünftigen Weg zur Projizierung des Index vorschlägt. Bis jetzt habe ich eine ziemlich steile Lernkurve, um MongoDB abzufragen. –

7

Die neu veröffentlichte MongoDB 3.2 unterstützt das Abwickeln des Array-Index.

Statt einem Pfad den $unwind Betreiber Geben, kann man ein Objekt mit dem Feld und das Feld pathincludeArrayIndex geben, die den Array-Index halten werden.

Von MongoDB official documentation:

{ 
    $unwind: 
    { 
    path: <field path>, 
    includeArrayIndex: <string>, 
    preserveNullAndEmptyArrays: <boolean> 
    } 
}