2014-12-27 9 views
7

Czy można uzyskać dostęp do indeksu tablicy podczas rozwijania tablicy (http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind) przy użyciu potoku agregacji MongoDB?Jak wyświetlać indeks tablicy po rozwinięciu tablicy za pomocą struktury agregacji MongoDB

Na przykład załóżmy, że mam odwijania ten dokument w kolekcji "C":

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

czym ta operacja:

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

powróci kursor do dokumentów:

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

Chciałabym móc dowiedzieć się czegoś więcej "a" ma indeks 0, "b" ma indeks 1, a "c" ma indeks "2" w oryginalnej tablicy przed rozwinięciem.

Jak mogę wyświetlić indeks tablicy w operacji rozwijania?

Odpowiedz

4

Obecnie wydaje się, że nie jest to możliwe przy użyciu struktury agregacji. Istnieje nierozwiązany otwarty problem z nim związany: https://jira.mongodb.org/browse/SERVER-4588.

Aby obejść ten problem, można użyć funkcji Map-reduce, w której funkcja mapy przypisuje indeks do każdego elementu tablicy.

var map = function(){ 
    for(var i=0;i<this.elements.length;i++){ 
    emit({"_id":this._id,"index":i},{"index":i,"value":this.elements[i]}); 
    } 
} 
+0

Dziękujemy! Odniosłem wrażenie, że nie było to możliwe, ponieważ widziałem teraz przykłady i nie znalazłem żadnego operatora, który by zaprojektował indeks. Ale nie znalazłem jeszcze tego raportu o problemie. Dzięki! –

+1

Nie ma za co. Kombinacja operatorów '$ let' i' $ map' może zbliżyć nas do wartości manipulowanych projektem, ale ze względu na ograniczenia zakresu nie można uzyskać przyrostowego indeksowania. – BatScream

+0

Jestem świadomy, że przy pomocy mapy/zmniejszenia można zrobić praktycznie wszystko w granicach mapy/zmniejszyć implementację. Jedną rzeczą, która mnie zastanawia jest to, jak zapewnić, by wynik mapy nie był zbyt duży. W odniesieniu do problemu, który sobie stawiam, myślę, że sprawa JIRA proponuje rozsądny sposób projekcji indeksu. Do tej pory mam dość stromą krzywą uczenia się, aby przetestować MongoDB. –

7

Nowo wydany MongoDB 3.2 obsługuje rozwijanie indeksu tablic.

Zamiast podawać ścieżkę operator $unwind, można przekazać obiekt z polem path i polem includeArrayIndex, które będzie przechowywać indeks tablicy.

Od MongoDB official documentation:

{ 
    $unwind: 
    { 
    path: <field path>, 
    includeArrayIndex: <string>, 
    preserveNullAndEmptyArrays: <boolean> 
    } 
} 
Powiązane problemy