Tamás Polgár
Tamás Polgár

Reputation: 2262

Join two arrays in MongoDB aggregation?

An aggregation yielded two arrays: $array1 and $array2:

    $array1 = [{ key1_1: 0,
                 key1_2: 1,
                 key1_3: 2 
               },
               { key1_1: 0,
                 key1_2: 1,
                 key1_3: 2 
               }]

    $array2 = [{ key2_1: 0,
                 key2_2: 1 
               }, 
               { key2_1: 0,
                 key2_2: 1 
               }]

I would like to join them completely.

If I do this:

{ $project: { 'output': { $concatArrays: [ '$array1', '$array2' ] } }

the result will be this:

output: [{  key1_1: 0,
            key1_2: 1,
            key1_3: 2
          },
          { key2_1: 0,
            key2_2: 1 
          },
          { key1_1: 0,
            key1_2: 1,
            key1_3: 2
          },
          { key2_1: 0,
            key2_2: 1
          }]

whereas I would prefer this:

output: [{  key1_1: 0, 
            key1_2: 1,
            key1_3: 2,
            key2_1: 0,
            key2_2: 1
          },
          { key1_1: 0,
            key1_2: 1,
            key1_3: 2,
            key2_1: 0,
            key2_2: 1
          }]

I guess this is only possible by $project, but how?

Upvotes: 2

Views: 2138

Answers (2)

Tamás Polgár
Tamás Polgár

Reputation: 2262

Here is a solution, which is not exactly what I wanted, but it's good enough.

In the aggregation, first

{ $unwind: '$array1' },
{ $unwind: '$array2' },

then do a grouping:

{ $group: { _id: '$_id',
           arrays: { $push: { 
                              array1: '$array1',
                              array2: '$array2' 
                            }
                   }
           }
 },

The result will be:

"arrays": {[
             "array1": {
               ...
             },
             "array2": {
               ...
             }
           ]}

Upvotes: 1

Vao Tsun
Vao Tsun

Reputation: 51446

Not aggregation could be easier?:

> var a =[];
> var array1 = [{ key1_1: 0,                  key1_2: 1,                  key1_3: 2                 },                { key1_1: 0,                  key1_2: 1,                  key1_3: 2                 }];
> var array2 = [{ key2_1: 0,                  key2_2: 1                 },                 { key2_1: 0,                  key2_2: 1                 }];
> array1.forEach(function(o,i){a.push(Object.assign(array1[i],array2[i]));});
> printjson(a);
[
        {
                "key1_1" : 0,
                "key1_2" : 1,
                "key1_3" : 2,
                "key2_1" : 0,
                "key2_2" : 1
        },
        {
                "key1_1" : 0,
                "key1_2" : 1,
                "key1_3" : 2,
                "key2_1" : 0,
                "key2_2" : 1
        }
]

Upvotes: 0

Related Questions