> db.combos.find() {_id:1, a:[ 1,2,3]} > db.combos.aggregate({$project:{_id:0, pairs: <generate-all-pairs>}}) {pairs: [ [1,2], [1,3], [2,3] ]}

{$reduce:{ input:{$range:[0,{$size:"$a"}]}, initialValue:[], in:{$concatArrays:[ "$$value", {$let:{ vars:{i:"$$this"}, in:{$map:{ input:{$range:[{$add:[1,"$$i"]},{$size:"$a"}]}, in:[ {$arrayElemAt:["$a","$$i"]}, {$arrayElemAt:["$a","$$this"]}] }} }} ]} }}

pairs = []; for (i=0; i<a.length; i++) { for (j=a[i+1]; j<a.length; j++) { pairs.push([ [a[i], a[j] ]); } }