如何在Mongo的聚合管道的$ unwind阶段保留零长度值?

时间:2014-11-22 21:54:48

标签: javascript mongodb

我正在使用聚合管道编写Mongo查询。在聚合期间,我需要$unwind其中一个字段。但是,我不希望$unwind排除具有该字段的零长度数组的条目,因为我仍然需要它们进一步沿着管道。

我的字段名为items,它是一个对象数组,每个对象包含两个值:quantityprice。到目前为止,这是我的Mongo查询的片段:

db.MyCollection.aggregate([
    {$match: ... },
    {$project: ... },
    // put another $project here to retain zero-length values? how to format it?
    {$project: {
            _id: "$$ROOT",
            items: {
                $ifNull: [
                    {
                        $literal: {
                            quantity: 0,
                            price: 0
                        }
                    }
                ]
            }
        }
    },
    {$unwind: "$items"},
    {$group: ... },
    {$project: ... },
    ...
]);

正如您所看到的,这已经处理了文档根本没有items字段的情况,在这种情况下,它会将其添加并为其提供一个空值来展开。

但是,未处理的是已经存在items字段的文档,但它是空白的。我以为我可以使用$cond$size的某种组合来明确检查另一个$project中的大小为零,然后在这种情况下替换相同的文字,但是{{1期望一个布尔值,所以我不太确定如何格式化它。

1 个答案:

答案 0 :(得分:4)

修改管道中的project阶段,如下所示:

projection阶段执行以下两项操作:

  • 如果items数组为nulldoes not exist,请计算 items字段值为[](空数组。)
  • 接下来检查刚计算的size字段的items是否为0,如果 它是0,然后将其值更改为具有默认对象的数组。

舞台代码:

db.MyCollection.aggregate([
...
{$project:{"_id":"$$ROOT",
           "items":{$cond:[
                          {$eq:[{$size:{$ifNull:["$items",[]]}},0]},
                          [{"quantity":0,"price":0}],
                          "$items"
                          ]}}},
{$unwind:"$items"},
...
])