是否有一个选项只在数组不为空时展开?

时间:2015-05-23 16:01:12

标签: mongodb

我正在尝试使用unwind运行查询。 (聚合) 问题是当我在空数组上运行时,我得到空结果。 我知道这是一个问题:

  

如果数组在输入文档中包含空数组([]),则   管道忽略输入文档,不会输出文档   那个输入文件。 (来自MongoDB文档)

是否有一个选项,只有当我试图放松的数组不为空时才可以'放松'?

编辑:

$match = [
  '_id' => ['$in' => $ids]
];

$project = [
  'name' => true,
  'sum1' => true,
  'array1' => true,
  'array2' => true,
  'array3' => true
];

$group = [
  '_id' => '$name',
  'sum1' => ['$sum' => '$sum1'],
  'array1' =>  ['$push' => '$array1'],
  'array2' =>  ['$push' => '$array2'],
  'array3' =>  ['$push' => '$array3']
];

$query = [
  ['$match' => $match],
  ['$project' => $project],
  ['$group' => $group],
  ['$unwind' => '$array1'],
  ['$unwind' => '$array2'],
  ['$unwind' => '$array3']
];

$ret = mongo_get_db()
  ->selectCollection("collection")
  ->aggregate($query);

EDIT2:

{
    name: ‘name1’
    sum1: 2
    array1: 
    [
        {
            id: 111
            name: 222
        }   
    ]
    array2: []
    array3: []
}

{
    name: ‘name1’
    sum1: 10
    array1: 
    [
        {
            id: 122
            name: 333
        }
    ]
    array2: []
    array3: []
}

结果:

{
    name: ‘name1’
    sum1: 12
    array1:
    [
        {
            id: 111
            name: 222
        }
        {
            id: 122
            name: 333
        }
    ]
    array2: []
    array3: []
}

tnx:)

2 个答案:

答案 0 :(得分:0)

您可以在$match之前尝试使用$unwind运算符来过滤具有至少包含元素的数组的文档,使用至少存在第一个元素索引为0的逻辑数组(使用 dot notation ):

{ $match: { "array_field.0": { $exists: true } } };

答案 1 :(得分:0)

为什么不直接检查数组是否为空?

if(myArray.length === 0) { /* call your code here */ }