2017-02-14 33 views
2

我有一大組文件,可能有兩個數組或兩個之一。我想將它們合併到一個$項目中。

我目前使用$ concatArrays,但正如文檔所說,當其中一個數組爲空時它將返回null。我可以弄清楚如何在那裏添加一個條件語句,它將返回$ concatArrays或者其中的數組。

我:

{_id: 1, array1: ['a', 'b', 'b'], array2: ['e', 'e']} 
{_id: 2, array1: ['a', 'b', 'b']} 
{_id: 3, array2: ['e', 'e']} 

我想:

{_id: 1, combinedArray: ['a','b', 'b', 'e', 'e']} 
{_id: 2, combinedArray: ['a','b', 'b']} 
{_id: 3, combinedArray: ['e', 'e']} 

我想:

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

//output (unexpected result): 
    {_id: 1, combinedArray: ['a','b', 'b', 'e', 'e']} 
    {_id: 2, combinedArray: null} 
    {_id: 3, combinedArray: null} 

我也試過:

$project: { 
     combinedArray: { '$setUnion': [ '$array1', '$array2' ] } 
} 
//output (unexpected result): 
    {_id: 1, combinedArray: ['a','b', 'e']} 
    {_id: 2, combinedArray: ['a','b']} 
    {_id: 3, combinedArray: ['e']} 
+0

你在(1)和(2)之後得到了什麼? –

+0

它們被包裝在一個$項目中。我嘗試了兩個獨立。 – Mika

+0

我還是不明白你在(1)和(2)之後有什麼。錯誤?沒有預期的結果? –

回答

6

至於$concatArrays文件說

如果任何參數解析爲一個null值或指的是fie ld 缺失,$ concatArrays返回null。

因此,我們需要確保我們不傳遞引用缺少字段或null的參數。你可以做到這一點與$ifNull操作:

計算表達式,如果 表達式計算爲一個非空值返回表達式的值。如果表達式將 評估爲空值(包括未定義值的實例或缺少 字段),則返回替換表達式的值。

所以才返回空數組,如果申請表達式的計算結果不是非空值:

db.collection.aggregate([ 
    {$project: { 
      combinedArray: { '$concatArrays': [ 
       {$ifNull: ['$array1', []]}, 
       {$ifNull: ['$array2', []]} 
      ] } 
     } 
    } 
]) 
1

您可以輕鬆地與$ifNull運營商實現這一目標:

db.arr.aggregate([ 
    { 
     $project:{ 
     combinedArray:{ 
      $concatArrays:[ 
       { 
        $ifNull:[ 
        "$array1", 
        [] 
        ] 
       }, 
       { 
        $ifNull:[ 
        "$array2", 
        [] 
        ] 
       } 
      ] 
     } 
     } 
    } 
]) 

輸出:

{ "_id" : 1, "combinedArray" : [ "a", "b", "b", "e", "e" ] } 
{ "_id" : 2, "combinedArray" : [ "a", "b", "b" ] } 
{ "_id" : 3, "combinedArray" : [ "e", "e" ] } 
1

我試圖與嵌套$ COND要做到這一點,用$ IFNULL是更好地回答,但仍發佈我的答案。

db.getCollection('test').aggregate([{ 
$project: { 
    combinedArray: { $cond: [ 
     { $and: [ { $isArray: ["$array1"] }, { $isArray: ["$array2"] } ] }, 
     { '$concatArrays': [ '$array1', '$array2' ] }, 
     { $cond: [ 
      { $isArray: ["$array1"] }, 
      "$array1", 
      "$array2" 
      ] } 
     ] } 
    } 
}]) 
相關問題