在收集抽象文件MD给出:骨料
{
vals : [{
uid : string,
val : string|array
}]
}
下文中,部分正确的聚合给出:
db.md.aggregate(
{ $unwind : "$vals" },
{ $match : { "vals.uid" : { $in : ["x", "y"] } } },
{
$group : {
_id : { uid : "$vals.uid" },
vals : { $addToSet : "$vals.val" }
}
}
);
,可能导致以下结果:
"result" : [
{
"_id" : {
"uid" : "x"
},
"vals" : [
[
"24ad52bc-c414-4349-8f3a-24fd5520428e",
"e29dec2f-57d2-43dc-818a-1a6a9ec1cc64"
],
[
"5879b7a4-b564-433e-9a3e-49998dd60b67",
"24ad52bc-c414-4349-8f3a-24fd5520428e"
]
]
},
{
"_id" : {
"uid" : "y"
},
"vals" : [
"0da5fcaa-8d7e-428b-8a84-77c375acea2b",
"1721cc92-c4ee-4a19-9b2f-8247aa53cfe1",
"5ac71a9e-70bd-49d7-a596-d317b17e4491"
]
}
]
as x是在包含数组的文档上聚合的结果,而不是一个字符串,结果中的vals是一个数组数组。我在这种情况下寻找的是有一个平坦的数组(如y的结果)。
对我来说,它似乎是我想通过一个aggegration调用来实现,目前不支持任何给定的操作,例如,无法完成类型转换,或者在每种情况下将数组展开为输入类型。
是地图减少我唯一的选择吗?如果没有...任何提示?
谢谢!
最干净的解决办法是返工您的架构,使'vals.val'是总是一个数组。然后这个(和其他许多事情)变得容易。 – JohnnyHK 2013-02-22 15:11:04