Mongo $ concatArrays即使为null

Mik*_*ika 5 mongodb

我有一大堆文档,可能有两个数组或两个数组之一.我想在$ project中合并它们.

我目前正在使用$ concatArrays,但正如文档所述,当其中一个数组为null时,它返回null.我可以弄清楚如何在那里添加一个条件语句,它将返回$ concatArrays或者那里的数组.

我有:

{_id: 1, array1: ['a', 'b', 'b'], array2: ['e', 'e']}
{_id: 2, array1: ['a', 'b', 'b']}
{_id: 3, array2: ['e', 'e']}
Run Code Online (Sandbox Code Playgroud)

我想要:

{_id: 1, combinedArray: ['a','b', 'b', 'e', 'e']}
{_id: 2, combinedArray: ['a','b', 'b']}
{_id: 3, combinedArray: ['e', 'e']}
Run Code Online (Sandbox Code Playgroud)

我试过了:

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

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

我也尝试过:

 $project: {
      combinedArray: { '$setUnion': [ '$array1', '$array2' ] }
 }
 //output (unexpected result): 
     {_id: 1, combinedArray: ['a','b', 'e']}
     {_id: 2, combinedArray: ['a','b']}
     {_id: 3, combinedArray: ['e']}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 12

正如$ concatArrays的文档所说

如果任何参数解析为null值或引用缺少的字段,$ concatArrays将返回null.

所以我们需要确保我们没有传递引用缺失字段或null的参数.您可以使用$ ifNull运算符执行此操作:

如果表达式求值为非null值,则计算表达式并返回表达式的值.如果表达式求值为空值(包括未定义值或缺少字段的实例),则返回替换表达式的值.

因此,如果字段表达式不会计算为非空值,则返回空数组:

db.collection.aggregate([
    {$project: {
          combinedArray: { '$concatArrays': [ 
              {$ifNull: ['$array1', []]},
              {$ifNull: ['$array2', []]}
           ] }
       }
    }
])
Run Code Online (Sandbox Code Playgroud)