我正在使用聚合管道编写Mongo查询。在聚合期间,我需要$unwind
其中一个字段。但是,我不希望$unwind
排除具有该字段的零长度数组的条目,因为我仍然需要它们进一步沿着管道。
我的字段名为items
,它是一个对象数组,每个对象包含两个值:quantity
和price
。到目前为止,这是我的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期望一个布尔值,所以我不太确定如何格式化它。
答案 0 :(得分:4)
修改管道中的project
阶段,如下所示:
projection
阶段执行以下两项操作:
null
或does 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"},
...
])