2017-02-16 54 views
1

聚集產生兩個數組:$array1$array2在MongoDB聚合中加入兩個數組?

$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 
       }] 

我想完全加入他們的行列。

如果我這樣做:

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

結果將是這樣的:

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 
      }] 

而我寧願這樣:

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 
      }] 

我想這是唯一可能通過$project ,但如何?

+1

沒有與接合陣列沒有問題。但是你試圖加入對象 - 將所有對象的字段複製到一個對象中 –

+0

有沒有簡單的方法來做到這一點? –

+0

我注意到正在使用的密鑰是重複的。你能否指定一個適當的樣本文件?如果您可以提供詳細信息(如數組對象中的字段數)以及數組中的對象數,這將會很有幫助。 –

回答

0

不聚集可能是更容易?:

> 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 
     } 
] 
+0

是的,它會是,但它不是MongoDB解決方案。但顯然沒有更好的,所以我會解決它。 –

0

這裏是一個解決方案,這不正是我想要的,但它的不夠好。

在凝集,第一

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

然後做一個分組:

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

其結果將是:

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