集合 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"
]
}
]
由于 x 是在包含数组而不是字符串的文档上聚合的结果,因此结果中的 vals 是一个数组数组。在这种情况下,我寻找的是一个扁平的数组(如 y 的结果)。
对我来说,似乎我只想通过一个聚合调用来实现的目标,目前不受任何给定操作的支持,例如无法完成类型转换或在每种情况下展开都期望将数组作为输入类型。
map reduce 是我唯一的选择吗?如果没有......任何提示?
谢谢!