我正在尝试使用$unwind编写聚合查询,无论元素是否为数组。 我知道$unwind
无法处理非数组元素,但我想知道是否有一种方法使其起作用,例如将此元素转换为数组。
我的集合如下:
{
{"x" : 1, "y" : {"c" : 2, "i" : 3}},
{"x" : 1, "y" : [{"c" : 4, "i" : 5}, {"c" : 6, "i" : 7}]}
}
在使用$unwind
之前,我认为需要像这样:
{
{"x" : 1, "y" : [{"c" : 2, "i" : 3}]},
{"x" : 1, "y" : [{"c" : 4, "i" : 5}, {"c" : 6, "i" : 7}]}
}
到目前为止在$project阶段,我可以检查元素是否是数组,但我不知道如何使用这个信息来创建或不创建一个数组。我知道我可以使用$push来创建一个数组,但如何保持未更改的数组元素并只推送没有数组元素?
我尝试了这个:
{$group : {"_id" : "$x", "myArray" : {$push : {$cond : {if : "$isArray", then : "$y", else : ["$y"]}}}}}
使用上述代码,我尝试将所有元素放在同一级别,但未成功,因为
["$y"]
返回的确切是(["$y"])
,没有评估,只是一个包含字符串的数组。我不想$unwind一个空数组,我想将非数组元素转换为数组元素,以便我可以$unwind。
任何帮助都将不胜感激。