我有一大堆文档,可能有两个数组或两个数组之一.我想在$ 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)