2014-12-27 19 views
7

È possibile accedere all'indice di array durante lo svolgimento di un array (http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind) utilizzando la pipeline di aggregazione MongoDB?Come proiettare l'indice di array dopo aver srotolato un array con il framework di aggregazione MongoDB

Per esempio, supponiamo che io sto svolgendo questo documento in collezione "c":

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

allora questa operazione:

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

tornerà un cursore per i documenti:

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

Mi piacerebbe essere in grado di capire oltre che "a" aveva indice 0, "b" aveva indice 1 e "c" aveva indice "2" nell'array originale prima di svolgersi.

Come si può proiettare l'indice di array in un'operazione di svolgimento?

risposta

4

Attualmente questo sembra non essere possibile utilizzando la struttura di aggregazione. C'è un problema aperto non risolto collegato ad esso: https://jira.mongodb.org/browse/SERVER-4588.

Come soluzione alternativa, è possibile utilizzare Riduci mappa, con la funzione mappa che assegna un indice a ciascun elemento di matrice.

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

Grazie! Ho avuto l'impressione che non fosse possibile dal momento che ho visto ora esempi né trovato alcun operatore per proiettare l'indice. Ma non ho ancora trovato questo rapporto. Grazie! –

+1

Sei il benvenuto. Una combinazione di operatori, '$ let' e' $ map' ci può avvicinare ai valori manipolati del progetto, ma a causa delle loro limitazioni di ambito, l'indicizzazione incrementale non può essere raggiunta. – BatScream

+0

Sono consapevole che con la mappa/riduzione si può fare praticamente qualsiasi cosa entro i limiti della mappa/ridurre l'implementazione. Una cosa che mi sconcerta è come assicurarsi che il risultato della mappa non diventi troppo grande. Per quanto riguarda il problema in oggetto, penso che il caso JIRA proponga un modo ragionevole per proiettare l'indice. Finora, sto vivendo una curva di apprendimento piuttosto ripida imparando a interrogare MongoDB. –

7

Il nuovo rilascio di MongoDB 3.2 supporta lo svolgimento dell'indice di array.

Invece di passare un percorso all'operatore $unwind, è possibile passare un oggetto con il campo path e il campo includeArrayIndex che manterrà l'indice di array.

Da MongoDB official documentation:

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